aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-05-13 15:32:35 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-05-13 15:32:35 -0400
commit783faa4728c59b3ec494ebfc1a6a08597c085756 (patch)
treea6b39b85f4090a6ecac1315acfcbbdf3d7ffbbaf
parent51543dc77b0a7c1e82cfb4c991dbfed7f0e1e4fd (diff)
downloadgcc-783faa4728c59b3ec494ebfc1a6a08597c085756.zip
gcc-783faa4728c59b3ec494ebfc1a6a08597c085756.tar.gz
gcc-783faa4728c59b3ec494ebfc1a6a08597c085756.tar.bz2
re PR c++/57041 (ICE in lookup_field_1, at cp/search.c:376 (with dot-prefixed structure initialisation))
PR c++/57041 * decl.c (reshape_init_class): Handle error_mark_node. From-SVN: r198844
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/testsuite/g++.dg/ext/desig6.C18
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6c5d210..33c66e3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2013-05-13 Jason Merrill <jason@redhat.com>
+ PR c++/57041
+ * decl.c (reshape_init_class): Handle error_mark_node.
+
PR c++/57254
* typeck.c (merge_types): Propagate ref-qualifier
in METHOD_TYPE case.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 67e67e6..b16472f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5200,6 +5200,9 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p,
/* Handle designated initializers, as an extension. */
if (d->cur->index)
{
+ if (d->cur->index == error_mark_node)
+ return error_mark_node;
+
if (TREE_CODE (d->cur->index) == INTEGER_CST)
{
if (complain & tf_error)
diff --git a/gcc/testsuite/g++.dg/ext/desig6.C b/gcc/testsuite/g++.dg/ext/desig6.C
new file mode 100644
index 0000000..30882a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/desig6.C
@@ -0,0 +1,18 @@
+// PR c++/57041
+// { dg-options "-std=gnu++11" }
+// { dg-prune-output "error:" }
+
+template<typename T>
+union u {
+ T a;
+ char b;
+};
+
+template<typename T>
+u<T> make_u(T t) {
+ return { .a = t };
+}
+
+int main() {
+ return make_u<int>(1).a;
+}