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