mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-22 21:51:36 +08:00
re PR c/64417 ([SH] FAIL: gcc.c-torture/compile/pr28865.c -O0 (test for excess errors))
PR c/64417 c/ * c-typeck.c (process_init_element): Disallow initialization of a flexible array member with a string constant if the structure is in an array. testsuite/ * gcc.c-torture/compile/pr28865.c: Add dg-errors. * gcc.dg/pr64417.c: New test. From-SVN: r219278
This commit is contained in:
parent
0e905f0f46
commit
2cc901dcb2
@ -1,3 +1,10 @@
|
||||
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
|
||||
|
@ -8809,6 +8809,33 @@ process_init_element (location_t loc, struct c_expr value, bool implicit,
|
||||
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
|
||||
|
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
@ -5,12 +5,12 @@ struct var_len
|
||||
};
|
||||
|
||||
/* 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" } */
|
||||
};
|
||||
|
16
gcc/testsuite/gcc.dg/pr64417.c
Normal file
16
gcc/testsuite/gcc.dg/pr64417.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* 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" } */
|
Loading…
x
Reference in New Issue
Block a user