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