]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
C: Flex array in the middle via type alias is not reported [PR120353]
authorQing Zhao <qing.zhao@oracle.com>
Wed, 28 May 2025 21:13:38 +0000 (21:13 +0000)
committerQing Zhao <qing.zhao@oracle.com>
Fri, 30 May 2025 15:18:26 +0000 (15:18 +0000)
The root cause of the bug is: the TYPE_INCLUDES_FLEXARRAY marking of the
structure type is not copied to its aliased type.
The fix is to copy this marking to all the variant types of the current
structure type.

PR c/120353

gcc/c/ChangeLog:

* c-decl.cc (finish_struct): Copy TYPE_INCLUDES_FLEXARRAY marking
to all the variant types of the current structure type.

gcc/testsuite/ChangeLog:

* gcc.dg/pr120353.c: New test.

gcc/c/c-decl.cc
gcc/testsuite/gcc.dg/pr120353.c [new file with mode: 0644]

index e10f9c1ea7b61cfaee628582236e483b4444fb4d..38de96e12876104d6ebb2f8c7eb6bc7a89cbf24b 100644 (file)
@@ -9893,6 +9893,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
       C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
       C_TYPE_VARIABLY_MODIFIED (x) = C_TYPE_VARIABLY_MODIFIED (t);
       C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
+      TYPE_INCLUDES_FLEXARRAY (x) = TYPE_INCLUDES_FLEXARRAY (t);
     }
 
   /* Update type location to the one of the definition, instead of e.g.
diff --git a/gcc/testsuite/gcc.dg/pr120353.c b/gcc/testsuite/gcc.dg/pr120353.c
new file mode 100644 (file)
index 0000000..6f8e4ac
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR120353: Test for -Wflex-array-member-not-at-end on structure with 
+   typedef.  */ 
+/* { dg-do compile } */
+/* { dg-options "-Wflex-array-member-not-at-end" } */
+
+typedef struct flex flex_t;
+struct flex { int n; int data[]; };
+struct out_flex_mid {flex_t flex_data;  int m; }; /* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */
+
+typedef struct flex flex_t1;
+struct out_flex_mid1 {flex_t1 flex_data1; int n; }; /* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */