https://gcc.gnu.org/g:4665987e91198e268a56bf72b220e7b4497619a0
commit r16-7933-g4665987e91198e268a56bf72b220e7b4497619a0 Author: Andrew Pinski <[email protected]> Date: Fri Mar 6 11:22:56 2026 -0800 c: Fix pragma inside a pragma [PR97991} After r0-72806-gbc4071dd66fd4d, c_parser_consume_token will assert if we get a pragma inside c_parser_consume_token but pragma processing will call pragma_lex which then calls c_parser_consume_token. In the case of pragma with expansion (redefine_extname, message and sometimes pack [and some target specific pragmas]) we get the expanded tokens that includes CPP_PRAGMA. We should just allow it instead of doing an assert. This follows what the C++ front-end does even and we no longer have an ICE. Bootstrapped and tested on x86_64-linux-gnu. PR c/97991 gcc/c/ChangeLog: * c-parser.cc (c_parser_consume_token): Allow CPP_PRAGMA if inside a pragma. gcc/testsuite/ChangeLog: * c-c++-common/cpp/pr97991-1.c: New test. Signed-off-by: Andrew Pinski <[email protected]> Diff: --- gcc/c/c-parser.cc | 6 +++++- gcc/testsuite/c-c++-common/cpp/pr97991-1.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 9816a9425ce1..0b8b23871090 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -960,7 +960,11 @@ c_parser_consume_token (c_parser *parser) gcc_assert (parser->tokens_avail >= 1); gcc_assert (parser->tokens[0].type != CPP_EOF); gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL); - gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA); + /* CPP_PRAGMA should not show up here except if there was an error or inside + another pragma. */ + gcc_assert (parser->in_pragma + || parser->error + || parser->tokens[0].type != CPP_PRAGMA); parser->last_token_location = parser->tokens[0].location; if (parser->tokens != &parser->tokens_buf[0]) parser->tokens++; diff --git a/gcc/testsuite/c-c++-common/cpp/pr97991-1.c b/gcc/testsuite/c-c++-common/cpp/pr97991-1.c new file mode 100644 index 000000000000..afdfd8a51b20 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr97991-1.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* Make sure malformed redefine_extname with a pragma inside does not cause an ICE. */ +#pragma redefine_extname _Pragma ("pack(bar)") /* { dg-warning "" } */
