From: Senthil Kumar Selvaraj Date: Wed, 28 Jan 2026 08:29:55 +0000 (+0530) Subject: c: Fix parser error on address space names [PR 123583] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3090d28ab359e8299aee33386dc44b81faf8edca;p=thirdparty%2Fgcc.git c: Fix parser error on address space names [PR 123583] This patch fixes a regression introduced by PR 67784 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67784) - it broke recognition of named address space qualifiers (such as __memx on AVR or __seg_gs on x86) after certain statements. The fix for PR 67784 attempts to reclassify tokens whose token->id_kind could have been set incorrectly (because of possibly wrong scope when peeking ahead). c_parser_maybe_reclassify_token only skips reclassification for C_ID_CLASSNAME though - a token with id_kind = C_ID_ADDRSPACE ends up getting reclassified as C_ID_ID, eventually causing a ": error: '
' undeclared" error later down the line. Rather than explicitly excluding C_ID_ADDRSPACE, the patch modifies the check to reclassify only tokens kinds that could potentially get incorrectly classified - C_ID_ID and C_ID_TYPENAME. Bootstrapped and regtested on x86_64-linux. PR c/123583 gcc/c/ChangeLog: * c-parser.cc (c_parser_maybe_reclassify_token): Reclassify only C_ID_ID and C_ID_TYPENAME tokens. gcc/testsuite/ChangeLog: * gcc.target/avr/pr123583.c: New test. * gcc.target/i386/pr123583.c: New test. --- diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 2949681663b..5ab3d84ea80 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -2323,7 +2323,7 @@ c_parser_maybe_reclassify_token (c_parser *parser) { c_token *token = c_parser_peek_token (parser); - if (token->id_kind != C_ID_CLASSNAME) + if (token->id_kind == C_ID_ID || token->id_kind == C_ID_TYPENAME) { tree decl = lookup_name (token->value); diff --git a/gcc/testsuite/gcc.target/avr/pr123583.c b/gcc/testsuite/gcc.target/avr/pr123583.c new file mode 100644 index 00000000000..1a6881ba56b --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr123583.c @@ -0,0 +1,9 @@ +/* { dg-do compile { target { ! avr_tiny } } } */ +/* { dg-additional-options "-std=gnu99 -w" } */ + +void h() { + if(1) + ; + __memx const int *x = 0; +} + diff --git a/gcc/testsuite/gcc.target/i386/pr123583.c b/gcc/testsuite/gcc.target/i386/pr123583.c new file mode 100644 index 00000000000..4a724073d7a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr123583.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=gnu99 -w" } */ + +void h() { + if(1) + ; + __seg_gs const int *x = 0; +}