https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106767
--- Comment #5 from Alexey Izbyshev <izbyshev at ispras dot ru> --- (In reply to Richard Biener from comment #4) > Is there a public specification of the Microsoft extension and how it is > supposed to behave with recursion or is the recursion behavior specified > by the C standard? I would be surprised if anything that could be called "a public specification" exists. The Clang patch[1] from 2010 cites only the rudimentary MSDN documentation[2]. I've modified the first test case to be compilable to assembler to avoid relying on broken /E: #define P(x) _Pragma(#x) #define f() P(push_macro("f")) P(pop_macro("f")) f() int f() { return 42; } and have checked that: * All x64 MSVC versions supporting C99 _Pragma and available at godbolt (19.25-19.33/latest) successfully compile it (with and without /Zc:preprocessor option which enables standard-conforming preprocessor, where it's supported). The only exception is 19.26 with /Zc:preprocessor: it emits strange syntax errors, but that's likely a bug in the new preprocessor (19.26 is the first version supporting it). * All x64 MSVC versions available at godbolt (19.0, 19.10, 19.14-19.33/latest) successfully compile the same test case with _Pragma(#x) replaced with MSVC-specific __pragma(x) equivalent (again, with and without /Zc:preprocessor where supported). This suggests that push/pop_macro isn't supposed to interfere with recursion detection. [1] https://github.com/llvm/llvm-project/commit/c0a585d63c6cf700ea01f1fe30c9f4cd51c1e97b [2] https://docs.microsoft.com/en-us/cpp/preprocessor/push-macro