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