Commit 116df786 by Richard Henderson Committed by Richard Henderson

re PR c/17322 (initializer folding broken)

        PR c/17322
        * c-typeck.c (valid_compound_expr_initializer): Use only
        initializer_constant_valid_p, and not TREE_CONSTANT.
        (digest_init): Likewise.
        (output_init_element): Likewise.

From-SVN: r87245
parent 41374e13
2004-09-09 Richard Henderson <rth@redhat.com>
PR c/17322
* c-typeck.c (valid_compound_expr_initializer): Use only
initializer_constant_valid_p, and not TREE_CONSTANT.
(digest_init): Likewise.
(output_init_element): Likewise.
2004-09-09 Giovanni Bajo <giovannibajo@gcc.gnu.org> 2004-09-09 Giovanni Bajo <giovannibajo@gcc.gnu.org>
* ra-build.c (copy_insn_p, remember_move, defuse_overlap_p_1, * ra-build.c (copy_insn_p, remember_move, defuse_overlap_p_1,
......
...@@ -3737,8 +3737,7 @@ valid_compound_expr_initializer (tree value, tree endtype) ...@@ -3737,8 +3737,7 @@ valid_compound_expr_initializer (tree value, tree endtype)
return valid_compound_expr_initializer (TREE_OPERAND (value, 1), return valid_compound_expr_initializer (TREE_OPERAND (value, 1),
endtype); endtype);
} }
else if (! TREE_CONSTANT (value) else if (!initializer_constant_valid_p (value, endtype))
&& ! initializer_constant_valid_p (value, endtype))
return error_mark_node; return error_mark_node;
else else
return value; return value;
...@@ -4166,16 +4165,8 @@ digest_init (tree type, tree init, bool strict_string, int require_constant) ...@@ -4166,16 +4165,8 @@ digest_init (tree type, tree init, bool strict_string, int require_constant)
inside_init = error_mark_node; inside_init = error_mark_node;
} }
else if (require_constant else if (require_constant
&& (!TREE_CONSTANT (inside_init) && !initializer_constant_valid_p (inside_init,
/* This test catches things like `7 / 0' which TREE_TYPE (inside_init)))
result in an expression for which TREE_CONSTANT
is true, but which is not actually something
that is a legal constant. We really should not
be using this function, because it is a part of
the back-end. Instead, the expression should
already have been turned into ERROR_MARK_NODE. */
|| !initializer_constant_valid_p (inside_init,
TREE_TYPE (inside_init))))
{ {
error_init ("initializer element is not constant"); error_init ("initializer element is not constant");
inside_init = error_mark_node; inside_init = error_mark_node;
...@@ -4203,7 +4194,8 @@ digest_init (tree type, tree init, bool strict_string, int require_constant) ...@@ -4203,7 +4194,8 @@ digest_init (tree type, tree init, bool strict_string, int require_constant)
inside_init = error_mark_node; inside_init = error_mark_node;
} }
else if (require_constant else if (require_constant
&& initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0) && !initializer_constant_valid_p (inside_init,
TREE_TYPE (inside_init)))
{ {
error_init ("initializer element is not computable at load time"); error_init ("initializer element is not computable at load time");
inside_init = error_mark_node; inside_init = error_mark_node;
...@@ -5585,21 +5577,23 @@ output_init_element (tree value, bool strict_string, tree type, tree field, ...@@ -5585,21 +5577,23 @@ output_init_element (tree value, bool strict_string, tree type, tree field,
constructor_erroneous = 1; constructor_erroneous = 1;
else if (!TREE_CONSTANT (value)) else if (!TREE_CONSTANT (value))
constructor_constant = 0; constructor_constant = 0;
else if (initializer_constant_valid_p (value, TREE_TYPE (value)) == 0 else if (!initializer_constant_valid_p (value, TREE_TYPE (value))
|| ((TREE_CODE (constructor_type) == RECORD_TYPE || ((TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE) || TREE_CODE (constructor_type) == UNION_TYPE)
&& DECL_C_BIT_FIELD (field) && DECL_C_BIT_FIELD (field)
&& TREE_CODE (value) != INTEGER_CST)) && TREE_CODE (value) != INTEGER_CST))
constructor_simple = 0; constructor_simple = 0;
if (require_constant_value && ! TREE_CONSTANT (value)) if (!initializer_constant_valid_p (value, TREE_TYPE (value)))
{ {
error_init ("initializer element is not constant"); if (require_constant_value)
value = error_mark_node; {
error_init ("initializer element is not constant");
value = error_mark_node;
}
else if (require_constant_elements)
pedwarn ("initializer element is not computable at load time");
} }
else if (require_constant_elements
&& initializer_constant_valid_p (value, TREE_TYPE (value)) == 0)
pedwarn ("initializer element is not computable at load time");
/* If this field is empty (and not at the end of structure), /* If this field is empty (and not at the end of structure),
don't do anything other than checking the initializer. */ don't do anything other than checking the initializer. */
......
/* PR 17322 */
struct s { int a; int b[1]; };
struct s x;
int *y = ((struct s *)&x.a)->b;
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