Home | History | Annotate | Download | only in Preprocessor
      1 /* Test pragma pop_macro and push_macro directives from
      2    http://msdn.microsoft.com/en-us/library/hsttss76.aspx */
      3 
      4 // pop_macro: Sets the value of the macro_name macro to the value on the top of
      5 // the stack for this macro.
      6 // #pragma pop_macro("macro_name")
      7 // push_macro: Saves the value of the macro_name macro on the top of the stack
      8 // for this macro.
      9 // #pragma push_macro("macro_name")
     10 //
     11 // RUN: %clang_cc1 -fms-extensions -E %s -o - | FileCheck %s
     12 
     13 #define X 1
     14 #define Y 2
     15 int pmx0 = X;
     16 int pmy0 = Y;
     17 #define Y 3
     18 #pragma push_macro("Y")
     19 #pragma push_macro("X")
     20 int pmx1 = X;
     21 #define X 2
     22 int pmx2 = X;
     23 #pragma pop_macro("X")
     24 int pmx3 = X;
     25 #pragma pop_macro("Y")
     26 int pmy1 = Y;
     27 
     28 // Have a stray 'push' to show we don't crash when having imbalanced
     29 // push/pop
     30 #pragma push_macro("Y")
     31 #define Y 4
     32 int pmy2 = Y;
     33 
     34 // The sequence push, define/undef, pop caused problems if macro was not
     35 // previously defined.
     36 #pragma push_macro("PREVIOUSLY_UNDEFINED1")
     37 #undef PREVIOUSLY_UNDEFINED1
     38 #pragma pop_macro("PREVIOUSLY_UNDEFINED1")
     39 #ifndef PREVIOUSLY_UNDEFINED1
     40 int Q;
     41 #endif
     42 
     43 #pragma push_macro("PREVIOUSLY_UNDEFINED2")
     44 #define PREVIOUSLY_UNDEFINED2
     45 #pragma pop_macro("PREVIOUSLY_UNDEFINED2")
     46 #ifndef PREVIOUSLY_UNDEFINED2
     47 int P;
     48 #endif
     49 
     50 // CHECK: int pmx0 = 1
     51 // CHECK: int pmy0 = 2
     52 // CHECK: int pmx1 = 1
     53 // CHECK: int pmx2 = 2
     54 // CHECK: int pmx3 = 1
     55 // CHECK: int pmy1 = 3
     56 // CHECK: int pmy2 = 4
     57 // CHECK: int Q;
     58 // CHECK: int P;
     59