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