aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-09-07 23:48:33 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-09-07 23:48:33 +0000
commitcf9ad9a773d6b804843fa11a55da91112cdd7c05 (patch)
tree4f5bca36819c0c2c172a2b3ec1aa934de5c312d6 /gcc
parent6ef0aa7b3b2d120b33b7852e6377c5536a677e6c (diff)
downloadgcc-cf9ad9a773d6b804843fa11a55da91112cdd7c05.zip
gcc-cf9ad9a773d6b804843fa11a55da91112cdd7c05.tar.gz
gcc-cf9ad9a773d6b804843fa11a55da91112cdd7c05.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/struct1.C6
-rw-r--r--gcc/varasm.c24
4 files changed, 37 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3308345..edd91eb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 51a0194..a88421b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* g++.dg/expr/comma1.C: New test.
diff --git a/gcc/testsuite/g++.dg/init/struct1.C b/gcc/testsuite/g++.dg/init/struct1.C
new file mode 100644
index 0000000..4cabc99
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/struct1.C
@@ -0,0 +1,6 @@
+struct bug {
+ const char *name;
+ unsigned long type;
+};
+
+struct bug s = { 0, (unsigned long) &s | 1 };
diff --git a/gcc/varasm.c b/gcc/varasm.c
index d327cb2..84fbf25 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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;
+
+ 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 : 0;
+ return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
case INTEGER_CST:
case VECTOR_CST: