c: Disallow braces around C2x auto initializers
authorJoseph Myers <joseph@codesourcery.com>
Fri, 27 Jan 2023 21:38:57 +0000 (21:38 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 27 Jan 2023 21:38:57 +0000 (21:38 +0000)
WG14 agreed at this week's meeting to remove support for braces around
auto scalar initializers, as incompatible with C++ auto handling of
braced initializers; thus remove that support in GCC.

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/c/
* c-parser.cc (c_parser_declaration_or_fndef): Do not allow braces
around auto initializer.

gcc/testsuite/
* gcc.dg/c2x-auto-1.c, gcc.dg/c2x-auto-3.c: Expect braces around
auto initializers to be disallowed.

gcc/c/c-parser.cc
gcc/testsuite/gcc.dg/c2x-auto-1.c
gcc/testsuite/gcc.dg/c2x-auto-3.c

index 803b04b..6923000 100644 (file)
@@ -2480,18 +2480,7 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
                  int flag_sanitize_save = flag_sanitize;
                  if (nested && !empty_ok)
                    flag_sanitize = 0;
-                 if (std_auto_type_p
-                     && c_parser_next_token_is (parser, CPP_OPEN_BRACE))
-                   {
-                     matching_braces braces;
-                     braces.consume_open (parser);
-                     init = c_parser_expr_no_commas (parser, NULL);
-                     if (c_parser_next_token_is (parser, CPP_COMMA))
-                       c_parser_consume_token (parser);
-                     braces.skip_until_found_close (parser);
-                   }
-                 else
-                   init = c_parser_expr_no_commas (parser, NULL);
+                 init = c_parser_expr_no_commas (parser, NULL);
                  if (std_auto_type_p)
                    finish_underspecified_init (underspec_name,
                                                underspec_state);
index f8460fb..c50dacc 100644 (file)
@@ -4,14 +4,14 @@
 
 auto i = 1;
 extern int i;
-static auto l = { 0L };
+static auto l = 0L;
 extern long l;
 extern auto const d = 0.0; /* { dg-warning "initialized and declared 'extern'" } */
 extern const double d;
 double dx;
 auto ((i2)) = 3;
 extern int i2;
-const auto i3 [[]] = { 4, };
+const auto i3 [[]] = 4;
 extern int i4;
 thread_local auto f = 1.0f;
 float ff;
index a34ce31..1ab3cc7 100644 (file)
@@ -62,3 +62,10 @@ f5 ()
 {
   static int auto e10 = 3; /* { dg-error "multiple storage classes in declaration specifiers" } */
 }
+
+void
+f6 ()
+{
+  static auto l = { 0L }; /* { dg-error "expected expression" } */
+  const auto i3 [[]] = { 4, }; /* { dg-error "expected expression" } */
+}