Commit ad47f1e5 by Jakub Jelinek Committed by Jakub Jelinek

c-typeck.c (store_init_value): If initializing object with array type of unknown…

c-typeck.c (store_init_value): If initializing object with array type of unknown size by a compound literal...

	* c-typeck.c (store_init_value): If initializing object with array
	type of unknown size by a compound literal, set object's size from
	compound literal size.
	* doc/extend.texi (Compound Literals): Adjust documentation.

	* gcc.dg/gnu89-init-1.c: Adjust for the new behaviour, add some
	additional tests.

From-SVN: r48343
parent e6724881
2001-12-28 Jakub Jelinek <jakub@redhat.com>
* c-typeck.c (store_init_value): If initializing object with array
type of unknown size by a compound literal, set object's size from
compound literal size.
* doc/extend.texi (Compound Literals): Adjust documentation.
2001-12-28 Richard Henderson <rth@redhat.com>
* real.c (etoe113, toe113): Ifndef INTEL_EXTENDED_IEEE_FORMAT.
......
......@@ -4495,6 +4495,33 @@ store_init_value (decl, init)
/* ANSI wants warnings about out-of-range constant initializers. */
STRIP_TYPE_NOPS (value);
constant_expression_warning (value);
/* Check if we need to set array size from compound literal size. */
if (TREE_CODE (type) == ARRAY_TYPE
&& TYPE_DOMAIN (type) == 0
&& value != error_mark_node)
{
tree inside_init = init;
if (TREE_CODE (init) == NON_LVALUE_EXPR)
inside_init = TREE_OPERAND (init, 0);
inside_init = fold (inside_init);
if (TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
{
tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
if (TYPE_DOMAIN (TREE_TYPE (decl)))
{
/* For int foo[] = (int [3]){1}; we need to set array size
now since later on array initializer will be just the
brace enclosed list of the compound literal. */
TYPE_DOMAIN (type) = TYPE_DOMAIN (TREE_TYPE (decl));
layout_type (type);
layout_decl (decl, 0);
}
}
}
}
/* Methods for storing and printing names for error messages. */
......
......@@ -1598,8 +1598,7 @@ It is handled as if the object was initialized only with the bracket
enclosed list if compound literal's and object types match.
The initializer list of the compound literal must be constant.
If the object being initialized has array type of unknown size, the size is
determined by compound literal's initializer list, not by the size of the
compound literal.
determined by compound literal size.
@example
static struct foo x = (struct foo) @{1, 'a', 'b'@};
......@@ -1612,7 +1611,7 @@ The above lines are equivalent to the following:
@example
static struct foo x = @{1, 'a', 'b'@};
static int y[] = @{1, 2, 3@};
static int z[] = @{1@};
static int z[] = @{1, 0, 0@};
@end example
@node Designated Inits
......
2001-12-28 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/gnu89-init-1.c: Adjust for the new behaviour, add some
additional tests.
2001-12-27 Roger Sayle <roger@eyesopen.com>
* gcc.c-torture/execute/string-opt-16.c: New testcase.
......
......@@ -20,6 +20,8 @@ struct A a = (struct A) { .j = 6, .k[2] = 12 };
struct B b = (struct B) { };
int c[] = (int []) { [2] = 6, 7, 8 };
int d[] = (int [3]) { 1 };
int e[2] = (int []) { 1, 2 };
int f[2] = (int [2]) { 1 };
int main (void)
{
......@@ -29,9 +31,17 @@ int main (void)
abort ();
if (sizeof (c) != 5 * sizeof (int))
abort ();
if (d[0] != 1)
if (d[0] != 1 || d[1] || d[2])
abort ();
if (sizeof (d) != sizeof (int))
if (sizeof (d) != 3 * sizeof (int))
abort ();
if (e[0] != 1 || e[1] != 2)
abort ();
if (sizeof (e) != 2 * sizeof (int))
abort ();
if (f[0] != 1 || f[1])
abort ();
if (sizeof (f) != 2 * sizeof (int))
abort ();
exit (0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment