[Bug c/88766] [9 Regression] Rejects valid? C code since r259641

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jan 9 18:20:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88766

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
A C proof of concept:
--- gcc/c/c-parser.c.jj 2019-01-07 09:47:33.187515618 +0100
+++ gcc/c/c-parser.c    2019-01-09 19:15:05.216756760 +0100
@@ -4624,6 +4624,11 @@ c_parser_braced_init (c_parser *parser,
     }
   else
     really_start_incremental_init (type);
+
+  /* Accept #pragmas at braced init scope.  */
+  while (c_parser_next_token_is (parser, CPP_PRAGMA))
+    c_parser_pragma (parser, pragma_struct, NULL);
+
   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
     {
       pedwarn (brace_loc, OPT_Wpedantic, "ISO C forbids empty initializer
braces");
@@ -4634,6 +4639,10 @@ c_parser_braced_init (c_parser *parser,
         comma.  */
       while (true)
        {
+         /* Accept #pragmas at braced init scope.  */
+         while (c_parser_next_token_is (parser, CPP_PRAGMA))
+           c_parser_pragma (parser, pragma_struct, NULL);
+
          c_parser_initelt (parser, &braced_init_obstack);
          if (parser->error)
            break;
@@ -4644,10 +4653,20 @@ c_parser_braced_init (c_parser *parser,
            }
          else
            break;
+
+         /* Accept #pragmas at braced init scope.  */
+         while (c_parser_next_token_is (parser, CPP_PRAGMA))
+           c_parser_pragma (parser, pragma_struct, NULL);
+
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
            break;
        }
     }
+
+  /* Accept #pragmas at braced init scope.  */
+  while (c_parser_next_token_is (parser, CPP_PRAGMA))
+    c_parser_pragma (parser, pragma_struct, NULL);
+
   c_token *next_tok = c_parser_peek_token (parser);
   if (next_tok->type != CPP_CLOSE_BRACE)
     {

Of course, this one parses all pragmas, rather than just GCC diagnostic, and
for most pragmas handling them in this context is undesirable (either
meaningful, or e.g. OpenMP/OpenACC forbids them there).


More information about the Gcc-bugs mailing list