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.
{
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);
--- /dev/null
+/* { dg-do compile { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -w" } */
+
+void h() {
+ if(1)
+ ;
+ __memx const int *x = 0;
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-std=gnu99 -w" } */
+
+void h() {
+ if(1)
+ ;
+ __seg_gs const int *x = 0;
+}