https://gcc.gnu.org/g:3090d28ab359e8299aee33386dc44b81faf8edca

commit r16-7117-g3090d28ab359e8299aee33386dc44b81faf8edca
Author: Senthil Kumar Selvaraj <[email protected]>
Date:   Wed Jan 28 13:59:55 2026 +0530

    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: '<address space name>' 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:
---
 gcc/c/c-parser.cc                        | 2 +-
 gcc/testsuite/gcc.target/avr/pr123583.c  | 9 +++++++++
 gcc/testsuite/gcc.target/i386/pr123583.c | 8 ++++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index 2949681663bf..5ab3d84ea80c 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 000000000000..1a6881ba56bb
--- /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 000000000000..4a724073d7a7
--- /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;
+}

Reply via email to