+2015-01-07 Marek Polacek <polacek@redhat.com>
+
+ PR c/64417
+ * c-typeck.c (process_init_element): Disallow initialization of
+ a flexible array member with a string constant if the structure
+ is in an array.
+
2015-01-05 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/64344
break;
}
+ /* Error for initialization of a flexible array member with
+ a string constant if the structure is in an array. E.g.:
+ struct S { int x; char y[]; };
+ struct S s[] = { { 1, "foo" } };
+ is invalid. */
+ if (string_flag
+ && fieldcode == ARRAY_TYPE
+ && constructor_depth > 1
+ && TYPE_SIZE (fieldtype) == NULL_TREE
+ && DECL_CHAIN (constructor_fields) == NULL_TREE)
+ {
+ bool in_array_p = false;
+ for (struct constructor_stack *p = constructor_stack;
+ p && p->type; p = p->next)
+ if (TREE_CODE (p->type) == ARRAY_TYPE)
+ {
+ in_array_p = true;
+ break;
+ }
+ if (in_array_p)
+ {
+ error_init (loc, "initialization of flexible array "
+ "member in a nested context");
+ break;
+ }
+ }
+
/* Accept a string constant to initialize a subarray. */
if (value.value != 0
&& fieldcode == ARRAY_TYPE
+2015-01-07 Marek Polacek <polacek@redhat.com>
+
+ PR c/64417
+ * gcc.c-torture/compile/pr28865.c: Add dg-errors.
+ * gcc.dg/pr64417.c: New test.
+
2015-01-06 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/64505
};
/* Note - strictly speaking this array declaration is illegal
- since each element has a variable length. GCC allows it
- (for the moment) because it is used in existing code, such
- as glibc. */
+ since each element has a variable length. We used to allow
+ this because it was used in existing code.
+ Since PR64417 we reject this code. */
static const struct var_len var_array[] =
{
- { 1, "Long exposure noise reduction" },
- { 2, "Shutter/AE lock buttons" },
- { 3, "Mirror lockup" }
+ { 1, "Long exposure noise reduction" }, /* { dg-error "initialization of flexible array member" } */
+ { 2, "Shutter/AE lock buttons" }, /* { dg-error "initialization of flexible array member" } */
+ { 3, "Mirror lockup" } /* { dg-error "initialization of flexible array member" } */
};
--- /dev/null
+/* PR c/64417 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct foo { int x; char y[]; };
+struct bar { struct foo f; };
+struct baz { struct bar b; };
+
+struct foo a1 = { 1, "abc" };
+struct foo a2 = { 1, { "abc" } };
+struct foo b1[] = { { 1, "abc" } }; /* { dg-error "initialization of flexible array member" } */
+struct foo b2[] = { { 1, { "abc" } } }; /* { dg-error "initialization of flexible array member" } */
+struct bar c1[] = { { { 1, "abc" } } }; /* { dg-error "initialization of flexible array member" } */
+struct bar c2[] = { { { 1, { "abc" } } } }; /* { dg-error "initialization of flexible array member" } */
+struct baz d1[] = { { { { 1, "abc" } } } }; /* { dg-error "initialization of flexible array member" } */
+struct baz d2[] = { { { { 1, { "abc" } } } } }; /* { dg-error "initialization of flexible array member" } */