[clang] [Clang][Sema]: Allow flexible arrays in unions and alone in structs (PR #84428)
Harald van Dijk via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 18 18:55:43 PDT 2024
================
@@ -1,13 +1,158 @@
-// RUN: %clang_cc1 %s -verify=c -fsyntax-only
-// RUN: %clang_cc1 %s -verify -fsyntax-only -x c++
-// RUN: %clang_cc1 %s -verify -fsyntax-only -fms-compatibility
-// RUN: %clang_cc1 %s -verify -fsyntax-only -fms-compatibility -x c++
+// RUN: %clang_cc1 %s -verify=stock,c -fsyntax-only
+// RUN: %clang_cc1 %s -verify=stock,cpp -fsyntax-only -x c++
+// RUN: %clang_cc1 %s -verify=stock,cpp -fsyntax-only -fms-compatibility -x c++
+// RUN: %clang_cc1 %s -verify=stock,c,gnu -fsyntax-only -Wgnu-flexible-array-union-member -Wgnu-empty-struct
+// RUN: %clang_cc1 %s -verify=stock,c,microsoft -fsyntax-only -fms-compatibility -Wmicrosoft
// The test checks that an attempt to initialize union with flexible array
// member with an initializer list doesn't crash clang.
-union { char x[]; } r = {0}; // c-error {{flexible array member 'x' in a union is not allowed}}
+union { char x[]; } r = {0}; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}
+ microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}
+ */
+struct _name1 {
+ int a;
+ union {
+ int b;
+ char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}
+ microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}
+ */
+ };
+} name1 = {
+ 10,
+ 42, /* initializes "b" */
+};
-// expected-no-diagnostics
+struct _name1i {
+ int a;
+ union {
+ int b;
+ char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}
+ microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}
+ */
+ };
+} name1i = {
+ .a = 10,
+ .b = 42,
+};
+
+/* Initialization of flexible array in a union is never allowed. */
+struct _name2 {
+ int a;
+ union {
+ int b;
+ char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}
+ microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}
+ stock-note {{initialized flexible array member 'x' is here}}
+ */
+ };
+} name2 = {
+ 12,
+ 13,
+ { 'c' }, /* stock-error {{initialization of flexible array member is not allowed}} */
----------------
hvdijk wrote:
I think this is more than just a confusing error message. Consider `struct S { int a; union { int b; char x[]; }; int c; } s = {1, 2, 3};`. If `x` is given type `char[0]`, or `char[1]`, or `char[2]`, the `3` initializer applies to `s.c`. Yet inexplicably, if `x` has type `char[]`, the `3` initializer applies to `s.x` and any initializer is an error? That looks like a bug. We can even turn this into wrong-code: `struct S { int a; union { int b; char x[]; }; int c; int d; } s = {1, 2, {}, 3};`. This should initialise `a`, `b`, `c`, `d`, to `1`, `2`, `0`, `3`, but instead initialises them to `1`, `2`, `3`, `0`.
https://github.com/llvm/llvm-project/pull/84428
More information about the cfe-commits
mailing list