[Bug preprocessor/79948] _Pragma(“GCC error”) is processed differently inside and outside of a #if directive
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Mar 8 00:52:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79948
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-03-08
CC| |msebor at gcc dot gnu.org
Ever confirmed|0 |1
Known to fail| |4.1.3, 4.2.2, 4.3.2, 4.6.0,
| |5.4.0, 6.3.0, 7.0
--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
I'll confirm this as a bug with the test case below which is expected to
compile without an error (and does with other compilers I tested, including
Clang 5.0, EDG eccp 4.13, IBM XLC 13.1.3, Oracle cc 5.13, and Microsoft Visual
C/C++).
It seems to me that in 'return Y (E)' GCC first expands the E macro into the
_Pragma, then executes the _Pragma, and then expands the Y() macro.
I think it should expand all the macros first, i.e., first E, then Y, then X,
and then execute any _Pragmas.
$ cat t.c && gcc -S t.c
#define E _Pragma ("GCC error \"This is an error\"")
#define X(a) my##a
#define Y(a) X(a)
int my_Pragma (const char*);
int f (void)
{
return Y (E);
};
t.c: In function ‘f’:
t.c:10:11: error: This is an error
return Y (E);
^~~~~
t.c:3:14: error: ‘my’ undeclared (first use in this function)
#define X(a) my##a
^
t.c:4:14: note: in expansion of macro ‘X’
#define Y(a) X(a)
^
t.c:10:10: note: in expansion of macro ‘Y’
return Y (E);
^
t.c:3:14: note: each undeclared identifier is reported only once for each
function it appears in
#define X(a) my##a
^
t.c:4:14: note: in expansion of macro ‘X’
#define Y(a) X(a)
^
t.c:10:10: note: in expansion of macro ‘Y’
return Y (E);
^
More information about the Gcc-bugs
mailing list