https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82335

--- Comment #1 from pskocik at gmail dot com ---
This problem still persists in gcc 7.3.0. It appears pasting a macro containing
`_Pragma`s into
another macro is what's causing the displacement of the generated `#pragma`s.

I've cleaned up the example to make it clearer:


        #define PRAGMA(...) _Pragma(#__VA_ARGS__)
        #define PASTE(Expr)      Expr
        #define PUSH_IGN(X) PRAGMA(GCC diagnostic push) PRAGMA(GCC diagnostic
ignored X)
        #define POP() PRAGMA(GCC diagnostic pop)

        #define SIGNED_EH(X) \
                ({ PUSH_IGN("-Wtype-limits") \
                _Bool SIGNED_EH = ((__typeof(X))-1 < 0); \
                 POP() \
                 SIGNED_EH; })

        int main();
        {
                unsigned x;
                SIGNED_EH(x);       //OK; #pragmas generated around the
assignment:
        #if 0 //generated:
                         ({
                                #pragma GCC diagnostic push
                                #pragma GCC diagnostic ignored "-Wtype-limits"
                          _Bool SIGNED_EH = ((__typeof(x))-1 < 0);
                                #pragma GCC diagnostic pop
                          SIGNED_EH; });
        #endif


                PASTE(SIGNED_EH(x)); //OOPS generates:

        #if 0 //generated:
                        #pragma GCC diagnostic push
                        #pragma GCC diagnostic ignored "-Wtype-limits"
                        #pragma GCC diagnostic pop
                         ({ _Bool SIGNED_EH = ((__typeof(x))-1 < 0); SIGNED_EH;
});
        #endif
        }

Clang's preprocessor generates correct code even for the `PASTE(SIGNED_EH(x))`
case.

Reply via email to