aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorLee Millward <lee.millward@gmail.com>2006-07-18 17:22:39 +0000
committerLee Millward <lmillward@gcc.gnu.org>2006-07-18 17:22:39 +0000
commit492b73bda96d446cb62113559f1f705c1da365f3 (patch)
tree47341d836482d990d2715e53e3a1fe393fea0c52 /gcc
parent1e76e76b47437c53cf1eea76519edfbfed84c950 (diff)
downloadgcc-492b73bda96d446cb62113559f1f705c1da365f3.zip
gcc-492b73bda96d446cb62113559f1f705c1da365f3.tar.gz
gcc-492b73bda96d446cb62113559f1f705c1da365f3.tar.bz2
re PR c++/28258 (ICE with invalid constructor)
PR c++/28258 * method.c (locate_copy): Check for non_reference returning error_mark_node. PR c++/28260 * decl.c (duplicate_decls): Return error_mark_node on ambiguous declaration. PR c++/28258 * g++/dg/other/error13.C: New test. PR c++/28260 * g++.dg/template/friend44.C: New test. From-SVN: r115561
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl.c1
-rw-r--r--gcc/cp/method.c4
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/other/error13.C10
-rw-r--r--gcc/testsuite/g++.dg/template/friend44.C8
6 files changed, 41 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6f0b96b..cf7a062 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2006-07-18 Lee Millward <lee.millward@gmail.com>
+
+ PR c++/28258
+ * method.c (locate_copy): Check for non_reference
+ returning error_mark_node.
+
+ PR c++/28260
+ * decl.c (duplicate_decls): Return error_mark_node
+ on ambiguous declaration.
+
2006-07-18 Steve Ellcey <sje@cup.hp.com>
PR c++/27495
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index dd0e7e3..6165a2f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1371,6 +1371,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
{
error ("new declaration %q#D", newdecl);
error ("ambiguates old declaration %q+#D", olddecl);
+ return error_mark_node;
}
else
return NULL_TREE;
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 9029e85..312e3a9 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -946,6 +946,10 @@ locate_copy (tree type, void *client_)
if (!parms)
continue;
src_type = non_reference (TREE_VALUE (parms));
+
+ if (src_type == error_mark_node)
+ return NULL_TREE;
+
if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
continue;
if (!sufficient_parms_p (TREE_CHAIN (parms)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4df2b2f..2025aad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2006-07-18 Lee Millward <lee.millward@gmail.com>
+
+ PR c++/28258
+ * g++/dg/other/error13.C: New test.
+
+ PR c++/28260
+ * g++.dg/template/friend44.C: New test.
+
2006-07-18 Steve Ellcey <sje@cup.hp.com>
PR c++/27495
diff --git a/gcc/testsuite/g++.dg/other/error13.C b/gcc/testsuite/g++.dg/other/error13.C
new file mode 100644
index 0000000..037e288
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/error13.C
@@ -0,0 +1,10 @@
+//PR c++/28258
+
+struct A
+{ // { dg-error "" }
+ A(void x); // { dg-error "invalid use|incomplete type|candidates" }
+};
+
+struct B : A {}; // { dg-error "no matching function for call" }
+
+B b; // { dg-error "synthesized method" }
diff --git a/gcc/testsuite/g++.dg/template/friend44.C b/gcc/testsuite/g++.dg/template/friend44.C
new file mode 100644
index 0000000..a0f63c8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/friend44.C
@@ -0,0 +1,8 @@
+//PR c++/28260
+
+template<int> struct A
+{
+ friend int foo(); // { dg-error "new declaration" }
+};
+
+void foo() { A<0> a; } // { dg-error "ambiguates old declaration" }