re PR c++/11852 (ICE: g++ with bad struct initializer.)

PR c++/11852
	* varasm.c (initializer_constant_valid_p): Correct logic for
	CONSTRUCTORs.

	PR c++/11852
	* g++.dg/init/struct1.C: New test.

From-SVN: r71187
This commit is contained in:
Mark Mitchell 2003-09-07 23:48:33 +00:00 committed by Mark Mitchell
parent 6ef0aa7b3b
commit cf9ad9a773
4 changed files with 37 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2003-09-07 Mark Mitchell <mark@codesourcery.com>
PR c++/11852
* varasm.c (initializer_constant_valid_p): Correct logic for
CONSTRUCTORs.
2003-09-07 Roger Sayle <roger@eyesopen.com>
* expr.c (expand_operands): New function to expand an operand pair.

View File

@ -1,3 +1,8 @@
2003-09-07 Mark Mitchell <mark@codesourcery.com>
PR c++/11852
* g++.dg/init/struct1.C: New test.
2003-09-07 Mark Mitchell <mark@codesourcery.com>
PR c++/12181

View File

@ -0,0 +1,6 @@
struct bug {
const char *name;
unsigned long type;
};
struct bug s = { 0, (unsigned long) &s | 1 };

View File

@ -3476,11 +3476,27 @@ initializer_constant_valid_p (tree value, tree endtype)
|| TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
&& TREE_CONSTANT (value)
&& CONSTRUCTOR_ELTS (value))
return
initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
endtype);
{
tree elt;
bool absolute = true;
return TREE_STATIC (value) ? null_pointer_node : 0;
for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
{
tree reloc;
value = TREE_VALUE (elt);
reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
if (!reloc)
return NULL_TREE;
if (reloc != null_pointer_node)
absolute = false;
}
/* For a non-absolute relocation, there is no single
variable that can be "the variable that determines the
relocation." */
return absolute ? null_pointer_node : error_mark_node;
}
return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
case INTEGER_CST:
case VECTOR_CST: