public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r15-209] C and C++ FE changes to support flexible array members in unions and alone in structures. Adjust tes
@ 2024-05-06 18:36 Qing Zhao
  0 siblings, 0 replies; only message in thread
From: Qing Zhao @ 2024-05-06 18:36 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:f27fc59d9f7c735d200fda647a487850144b10eb

commit r15-209-gf27fc59d9f7c735d200fda647a487850144b10eb
Author: Qing Zhao <qing.zhao@oracle.com>
Date:   Mon May 6 16:26:19 2024 +0000

    C and C++ FE changes to support flexible array members in unions and alone in structures. Adjust testcases for flexible array member in union and alone in structure extension.
    
    PR c/53548
    
    gcc/c/ChangeLog:
    
            PR c/53548
            * c-decl.cc (finish_struct): Change errors to pedwarns for the cases
            flexible array members in union or alone in structures.
    
    gcc/cp/ChangeLog:
    
            PR c/53548
            * class.cc (diagnose_flexarrays): Change error to pdewarn for the case
            flexible array members alone in structures.
            * decl.cc (grokdeclarator): Change error to pdewarn for the case
            flexible array members in unions.
    
    gcc/ChangeLog:
    
            PR c/53548
            * stor-layout.cc (place_union_field): Use zero sizes for flexible array
            member fields.
    
    gcc/testsuite/ChangeLog:
    
            PR c/53548
            * c-c++-common/builtin-clear-padding-3.c: Adjust testcase.
            * g++.dg/ext/flexary12.C: Likewise.
            * g++.dg/ext/flexary19.C: Likewise.
            * g++.dg/ext/flexary2.C: Likewise.
            * g++.dg/ext/flexary3.C: Likewise.
            * g++.dg/ext/flexary36.C: Likewise.
            * g++.dg/ext/flexary4.C: Likewise.
            * g++.dg/ext/flexary5.C: Likewise.
            * g++.dg/ext/flexary8.C: Likewise.
            * g++.dg/torture/pr64280.C: Likewise.
            * gcc.dg/20050620-1.c: Likewise.
            * gcc.dg/940510-1.c: Likewise.

Diff:
---
 gcc/c/c-decl.cc                                    | 16 ++-----
 gcc/cp/class.cc                                    | 11 +++--
 gcc/cp/decl.cc                                     |  7 ++-
 gcc/stor-layout.cc                                 |  9 +++-
 .../c-c++-common/builtin-clear-padding-3.c         | 10 ++--
 gcc/testsuite/g++.dg/ext/flexary12.C               |  6 +--
 gcc/testsuite/g++.dg/ext/flexary19.C               | 42 ++++++++---------
 gcc/testsuite/g++.dg/ext/flexary2.C                |  2 +-
 gcc/testsuite/g++.dg/ext/flexary3.C                |  2 +-
 gcc/testsuite/g++.dg/ext/flexary36.C               |  2 +-
 gcc/testsuite/g++.dg/ext/flexary4.C                | 54 +++++++++++-----------
 gcc/testsuite/g++.dg/ext/flexary5.C                |  4 +-
 gcc/testsuite/g++.dg/ext/flexary8.C                |  8 ++--
 gcc/testsuite/g++.dg/torture/pr64280.C             |  2 +-
 gcc/testsuite/gcc.dg/20050620-1.c                  |  2 +-
 gcc/testsuite/gcc.dg/940510-1.c                    |  4 +-
 16 files changed, 91 insertions(+), 90 deletions(-)

diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 52af8f32998..9ef2ab25773 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -9516,11 +9516,8 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
       if (flexible_array_member_type_p (TREE_TYPE (x)))
 	{
 	  if (TREE_CODE (t) == UNION_TYPE)
-	    {
-	      error_at (DECL_SOURCE_LOCATION (x),
-			"flexible array member in union");
-	      TREE_TYPE (x) = error_mark_node;
-	    }
+	    pedwarn (DECL_SOURCE_LOCATION (x), OPT_Wpedantic,
+		     "flexible array member in union is a GCC extension");
 	  else if (!is_last_field)
 	    {
 	      error_at (DECL_SOURCE_LOCATION (x),
@@ -9528,12 +9525,9 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
 	      TREE_TYPE (x) = error_mark_node;
 	    }
 	  else if (!saw_named_field)
-	    {
-	      error_at (DECL_SOURCE_LOCATION (x),
-			"flexible array member in a struct with no named "
-			"members");
-	      TREE_TYPE (x) = error_mark_node;
-	    }
+	    pedwarn (DECL_SOURCE_LOCATION (x), OPT_Wpedantic,
+		     "flexible array member in a struct with no named "
+		     "members is a GCC extension");
 	}
 
       if (pedantic && TREE_CODE (t) == RECORD_TYPE
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc
index 5ef7c71af61..0ce361eb88e 100644
--- a/gcc/cp/class.cc
+++ b/gcc/cp/class.cc
@@ -7624,6 +7624,7 @@ diagnose_flexarrays (tree t, const flexmems_t *fmem)
   bool diagd = false;
 
   const char *msg = 0;
+  const char *msg_fam = 0;
 
   if (TYPE_DOMAIN (TREE_TYPE (fmem->array)))
     {
@@ -7649,15 +7650,19 @@ diagnose_flexarrays (tree t, const flexmems_t *fmem)
       if (fmem->after[0])
 	msg = G_("flexible array member %qD not at end of %q#T");
       else if (!fmem->first)
-	msg = G_("flexible array member %qD in an otherwise empty %q#T");
+	msg_fam = G_("flexible array member %qD in an otherwise"
+		     " empty %q#T is a GCC extension");
 
-      if (msg)
+      if (msg || msg_fam)
 	{
 	  location_t loc = DECL_SOURCE_LOCATION (fmem->array);
 	  diagd = true;
 
 	  auto_diagnostic_group d;
-	  error_at (loc, msg, fmem->array, t);
+	  if (msg)
+	    error_at (loc, msg, fmem->array, t);
+	  else
+	    pedwarn (loc, OPT_Wpedantic, msg_fam, fmem->array, t);
 
 	  /* In the unlikely event that the member following the flexible
 	     array member is declared in a different class, or the member
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 71e4c2b5840..e8622e22a4c 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -14582,10 +14582,9 @@ grokdeclarator (const cp_declarator *declarator,
 	    if (ctype
 		&& (TREE_CODE (ctype) == UNION_TYPE
 		    || TREE_CODE (ctype) == QUAL_UNION_TYPE))
-	      {
-		error_at (id_loc, "flexible array member in union");
-		type = error_mark_node;
-	      }
+	      pedwarn (id_loc, OPT_Wpedantic,
+		       "flexible array member in union is a GCC extension");
+
 	    else
 	      {
 		/* Array is a flexible member.  */
diff --git a/gcc/stor-layout.cc b/gcc/stor-layout.cc
index e34be19689c..10c0809914c 100644
--- a/gcc/stor-layout.cc
+++ b/gcc/stor-layout.cc
@@ -1245,13 +1245,18 @@ place_union_field (record_layout_info rli, tree field)
       && TYPE_TYPELESS_STORAGE (TREE_TYPE (field)))
     TYPE_TYPELESS_STORAGE (rli->t) = 1;
 
+  /* We might see a flexible array member field (with no DECL_SIZE_UNIT), use
+     zero size for such field.  */
+  tree field_size_unit = DECL_SIZE_UNIT (field)
+			 ? DECL_SIZE_UNIT (field)
+			 : build_int_cst (sizetype, 0);
   /* We assume the union's size will be a multiple of a byte so we don't
      bother with BITPOS.  */
   if (TREE_CODE (rli->t) == UNION_TYPE)
-    rli->offset = size_binop (MAX_EXPR, rli->offset, DECL_SIZE_UNIT (field));
+    rli->offset = size_binop (MAX_EXPR, rli->offset, field_size_unit);
   else if (TREE_CODE (rli->t) == QUAL_UNION_TYPE)
     rli->offset = fold_build3 (COND_EXPR, sizetype, DECL_QUALIFIER (field),
-			       DECL_SIZE_UNIT (field), rli->offset);
+			       field_size_unit, rli->offset);
 }
 
 /* A bitfield of SIZE with a required access alignment of ALIGN is allocated
diff --git a/gcc/testsuite/c-c++-common/builtin-clear-padding-3.c b/gcc/testsuite/c-c++-common/builtin-clear-padding-3.c
index d16cc6aad05..a4f49f26db1 100644
--- a/gcc/testsuite/c-c++-common/builtin-clear-padding-3.c
+++ b/gcc/testsuite/c-c++-common/builtin-clear-padding-3.c
@@ -2,14 +2,12 @@
 /* { dg-do compile } */
 /* { dg-options "" } */
 
-union U { int a; char b[] __attribute__((aligned (2 * sizeof (int)))); };	/* { dg-error "flexible array member in union" } */
+union U { int a; char b[] __attribute__((aligned (2 * sizeof (int)))); };
 struct V { int a; union U b; };
-struct W { int a; union U b; int c; };
 
 void
-foo (union U *u, struct V *v, struct W *w)
+foo (union U *u, struct V *v)
 {
-  __builtin_clear_padding (u);
-  __builtin_clear_padding (v);
-  __builtin_clear_padding (w);
+  __builtin_clear_padding (u); /* { dg-error "flexible array member" "does not have well defined padding bits" } */
+  __builtin_clear_padding (v); /* { dg-error "flexible array member" "does not have well defined padding bits" } */
 }
diff --git a/gcc/testsuite/g++.dg/ext/flexary12.C b/gcc/testsuite/g++.dg/ext/flexary12.C
index b0964948731..6ba4b641713 100644
--- a/gcc/testsuite/g++.dg/ext/flexary12.C
+++ b/gcc/testsuite/g++.dg/ext/flexary12.C
@@ -6,7 +6,7 @@
 // { dg-options "-Wno-pedantic" }
 
 struct A {
-  int a [];  // { dg-error "flexible array member .A::a. in an otherwise empty .struct A." }
+  int a [];
 };
 
 void f1 ()
@@ -40,7 +40,7 @@ void f2 ()
 }
 
 struct D {
-  int a [];  // { dg-error "flexible array member .D::a. in an otherwise empty .struct D." }
+  int a [];
   D ();
 };
 
@@ -52,7 +52,7 @@ D::D ():    // { dg-error "initializer for flexible array member" }
 
 template <class T>
 struct C {
-  T a [];  // { dg-error "flexible array member" }
+  T a [];
 };
 
 void f3 ()
diff --git a/gcc/testsuite/g++.dg/ext/flexary19.C b/gcc/testsuite/g++.dg/ext/flexary19.C
index abfbc43028a..9a06f9ca758 100644
--- a/gcc/testsuite/g++.dg/ext/flexary19.C
+++ b/gcc/testsuite/g++.dg/ext/flexary19.C
@@ -12,7 +12,7 @@ struct S1
   // The following declares a named data member of an unnamed struct
   // (i.e., it is not an anonymous struct).
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s;
 };
 
@@ -21,7 +21,7 @@ struct S2
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s[1];
 };
 
@@ -30,7 +30,7 @@ struct S3
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s[];
 };
 
@@ -39,7 +39,7 @@ struct S4
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s[2];
 };
 
@@ -48,7 +48,7 @@ struct S5
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s[1][2];
 };
 
@@ -57,7 +57,7 @@ struct S6
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s[][2];
 };
 
@@ -66,7 +66,7 @@ struct S7
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } *s;
 };
 
@@ -75,7 +75,7 @@ struct S8
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } **s;
 };
 
@@ -84,7 +84,7 @@ struct S9
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } *s[1];
 };
 
@@ -93,7 +93,7 @@ struct S10
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } *s[];
 };
 
@@ -102,7 +102,7 @@ struct S11
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } **s[1];
 };
 
@@ -111,7 +111,7 @@ struct S12
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } **s[];
 };
 
@@ -120,7 +120,7 @@ struct S13
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } **s[2];
 };
 
@@ -129,7 +129,7 @@ struct S14
   int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } &s;
 };
 
@@ -138,7 +138,7 @@ struct S15
   int i;
 
   typedef struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } T15;
 };
 
@@ -159,8 +159,8 @@ struct S17
 {
   int i;
 
-  union {           // anonymous union
-    int a[];        // { dg-error "flexible array member in union" }
+  union {           // { dg-warning "invalid use" } 
+    int a[];        // { dg-warning "flexible array member in union" }
   };
 };
 
@@ -209,7 +209,7 @@ struct S22
   struct S22S {
     static int i;
 
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s;
 };
 
@@ -218,7 +218,7 @@ struct S23
   struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct" }
     static int i;   // { dg-error "static data member" }
 
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   };
 };
 
@@ -227,7 +227,7 @@ struct S24
   static int i;
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s;
 };
 
@@ -252,7 +252,7 @@ struct S26
   };
 
   struct {
-    int a[];        // { dg-error "in an otherwise empty" }
+    int a[];        // { dg-warning "in an otherwise empty" }
   } s;
 };
 
diff --git a/gcc/testsuite/g++.dg/ext/flexary2.C b/gcc/testsuite/g++.dg/ext/flexary2.C
index c0253777a1e..7095a3b0fb2 100644
--- a/gcc/testsuite/g++.dg/ext/flexary2.C
+++ b/gcc/testsuite/g++.dg/ext/flexary2.C
@@ -13,7 +13,7 @@ struct A {
 
 struct B {
   B() {}
-  A a[];   // { dg-error "extension|flexible array .* in an otherwise empty" }
+  A a[];
 };
 
 struct C {
diff --git a/gcc/testsuite/g++.dg/ext/flexary3.C b/gcc/testsuite/g++.dg/ext/flexary3.C
index 8344b42dd16..7785c9b190a 100644
--- a/gcc/testsuite/g++.dg/ext/flexary3.C
+++ b/gcc/testsuite/g++.dg/ext/flexary3.C
@@ -11,7 +11,7 @@
 // { dg-options "" }
 
 struct s {
-    char c[];   // { dg-error "flexible array member .* in an otherwise empty" }
+    char c[];
 };
 
 int main()
diff --git a/gcc/testsuite/g++.dg/ext/flexary36.C b/gcc/testsuite/g++.dg/ext/flexary36.C
index 5bb827cfd0e..87d6fb09210 100644
--- a/gcc/testsuite/g++.dg/ext/flexary36.C
+++ b/gcc/testsuite/g++.dg/ext/flexary36.C
@@ -25,7 +25,7 @@ struct {
 
 
 union {
-  int a[];          // { dg-error "flexible array member in union" }
+  int a[];
   int b;
 } du = { 1 };
 
diff --git a/gcc/testsuite/g++.dg/ext/flexary4.C b/gcc/testsuite/g++.dg/ext/flexary4.C
index bd28cf55de2..a87b7e71edb 100644
--- a/gcc/testsuite/g++.dg/ext/flexary4.C
+++ b/gcc/testsuite/g++.dg/ext/flexary4.C
@@ -11,79 +11,79 @@
 #include "flexary.h"
 
 struct Sx {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 // Verify that non-data members or static data members either before
 // or after a flexible array member in an otherwise empty struct don't
 // suppress the diagnostic.
 struct Sx2 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   typedef int I;
 };
 
 struct Sx3 {
   typedef int I;
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx4 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   enum E { e };
 };
 
 struct Sx5 {
   enum E { e };
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx6 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   static int i;
 };
 
 struct Sx7 {
   static int i;
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx8 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   Sx8 () { }
 };
 
 struct Sx9 {
   Sx9 () { }
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx10 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   virtual ~Sx10 () { }
 };
 
 struct Sx11 {
   virtual ~Sx11 () { }
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx12 {
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
   virtual void foo () = 0;
 };
 
 struct Sx13 {
   virtual void foo () = 0;
-  int a[];                  // { dg-error "in an otherwise empty" }
+  int a[];
 };
 
 struct Sx14 {
-  int a[][1];               // { dg-error "in an otherwise empty" }
+  int a[][1];
 };
 
 struct Sx15 {
   typedef int A[];
-  A a;                      // { dg-error "in an otherwise empty" }
+  A a;
 };
 
 // Verify also that a zero-size array doesn't suppress the diagnostic.
@@ -91,7 +91,7 @@ struct Sx16 {
   // a_0 below is diagnosed with -Wpedantic only and emits
   // warning: ISO C++ forbids zero-size arrays
   int a_0 [0];
-  int a_x [];               // { dg-error "in an otherwise empty" }
+  int a_x [];
 };
 
 struct Sx17 {
@@ -123,7 +123,7 @@ struct Sx19 {
 // so doesn't contribute its member to that of the enclosing struct.
 struct Sx20 {
   struct S { int i; };
-  int a_x [];               // { dg-error "in an otherwise empty" }
+  int a_x [];
 };
 
 struct Sx21 {
@@ -148,12 +148,12 @@ struct Sx24 {
 
 struct Sx25 {
   struct S { };
-  S a_x [];                 // { dg-error "flexible array member" }
+  S a_x [];
 };
 
 struct Sx26 {
   struct { }
-    a_x [];                   // { dg-error "flexible array member" }
+    a_x [];
 };
 
 struct Sx27 {
@@ -193,13 +193,13 @@ struct Sx32 {
 ASSERT_AT_END (Sx32, a);
 
 struct Sx33 {
-  int a [];                 // { dg-error "otherwise empty" }
+  int a [];
   friend int foo ();
 };
 
 struct Sx34 {
   friend int foo ();
-  int a [];                 // { dg-error "otherwise empty" }
+  int a [];
 };
 
 // Verify that intervening non-field declarations of members other
@@ -277,7 +277,7 @@ ASSERT_AT_END (Sx44, a);
 struct S_S_S_x {
   struct A {
     struct B {
-      int a[];              // { dg-error "flexible array member" }
+      int a[];
     } b;
   } a;
 };
@@ -300,7 +300,7 @@ struct NotAnon1 {
   // The following is not an anonymous struct -- the type is unnamed
   // but the object has a name.
   struct {
-    int bad[];              // { dg-error "otherwise empty" }
+    int bad[];
   } name;
 };
 
@@ -328,7 +328,7 @@ ASSERT_AT_END (Anon3, good);
 
 struct Anon4 {
   struct {
-    int in_empty_struct[];  // { dg-error "in an otherwise empty" }
+    int in_empty_struct[];
   };
 };
 
@@ -366,7 +366,7 @@ struct Six {
 ASSERT_AT_END (Six, a);
 
 class Cx {
-  int a[];                  // { dg-error "flexible array member" }
+  int a[];
 };
 
 class Cix {
@@ -390,7 +390,7 @@ struct S0i {
 
 struct S_a0_ax {
   int a0[0];
-  int ax[];                 // { dg-error "flexible array member" }
+  int ax[];
 };
 
 struct S_a0_i_ax {
@@ -417,7 +417,7 @@ struct Si_ax_a0 {
 
 struct S_u0_ax {
   union { } u[0];
-  int ax[];                 // { dg-error "flexible array member" }
+  int ax[];
 };
 
 struct S_a1_s2 {
diff --git a/gcc/testsuite/g++.dg/ext/flexary5.C b/gcc/testsuite/g++.dg/ext/flexary5.C
index d5ec1320496..3fb88c0e8a2 100644
--- a/gcc/testsuite/g++.dg/ext/flexary5.C
+++ b/gcc/testsuite/g++.dg/ext/flexary5.C
@@ -13,7 +13,7 @@ struct S_no_diag: T {
 
 template <class T>
 struct STx_1: T {
-  char a[];   // { dg-error "flexible array member" }
+  char a[];
 };
 
 template <class T, int I>
@@ -37,7 +37,7 @@ struct E1: E<0>, E<1> { };
 struct E2: E<2>, E<3> { };
 struct D1: E1, E2
 {
-    char a[];   // { dg-error "flexible array member" }
+    char a[];
 };
 
 struct NE { size_t i; };
diff --git a/gcc/testsuite/g++.dg/ext/flexary8.C b/gcc/testsuite/g++.dg/ext/flexary8.C
index 7a1811deaff..a0477f0fa41 100644
--- a/gcc/testsuite/g++.dg/ext/flexary8.C
+++ b/gcc/testsuite/g++.dg/ext/flexary8.C
@@ -4,26 +4,26 @@
 
 union U_i_ax {
     int i;
-    int a[];                  // { dg-error "flexible array member in union" }
+    int a[];
 };
 
 struct SU1 {
   union {
-    int a[];                  // { dg-error "flexible array member in union" }
+    int a[];
   };
 };
 
 struct SU2 {
   int n;
   union {
-    int a[];                  // { dg-error "flexible array member in union" }
+    int a[];
   };
 };
 
 struct SU3 {
   union {
     int n;
-    int a[];                  // { dg-error "flexible array member in union" }
+    int a[];
   };
 };
 
diff --git a/gcc/testsuite/g++.dg/torture/pr64280.C b/gcc/testsuite/g++.dg/torture/pr64280.C
index 5c569e864b4..1ea70c4e766 100644
--- a/gcc/testsuite/g++.dg/torture/pr64280.C
+++ b/gcc/testsuite/g++.dg/torture/pr64280.C
@@ -15,7 +15,7 @@ public:
 typedef int jmp_buf[];
 struct C
 {
-  jmp_buf cond_;   // { dg-error "flexible array member" }
+  jmp_buf cond_;
 };
 class F
 {
diff --git a/gcc/testsuite/gcc.dg/20050620-1.c b/gcc/testsuite/gcc.dg/20050620-1.c
index befdd963650..0a9e1d47845 100644
--- a/gcc/testsuite/gcc.dg/20050620-1.c
+++ b/gcc/testsuite/gcc.dg/20050620-1.c
@@ -5,7 +5,7 @@
 void
 foo (void)
 {
-  struct { int i[]; } u;	/* { dg-error "flexible array member" } */
+  struct { int i[]; } u;
 }
 
 void
diff --git a/gcc/testsuite/gcc.dg/940510-1.c b/gcc/testsuite/gcc.dg/940510-1.c
index 46183831d09..9bcd7881f71 100644
--- a/gcc/testsuite/gcc.dg/940510-1.c
+++ b/gcc/testsuite/gcc.dg/940510-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
 /* { dg-options "-std=c89 -pedantic" } */
 struct { int a[]; } x = { 0 };	/* { dg-warning "ISO C90 does not support flexible array members" } */
-/* { dg-error "flexible array member in a struct with no named members"  "" { target *-*-* }  .-1 } */
-
+/* { dg-warning "flexible array member in a struct with no named members is a GCC extension"  "" { target *-*-* }  .-1 } */
+/* { dg-warning "initialization of a flexible array member"  "" { target *-*-* }  .-2 } */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-05-06 18:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-06 18:36 [gcc r15-209] C and C++ FE changes to support flexible array members in unions and alone in structures. Adjust tes Qing Zhao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).