aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>2006-06-22 09:55:42 +0000
committerVolker Reichelt <reichelt@gcc.gnu.org>2006-06-22 09:55:42 +0000
commit728da67271802eba3470cbe13025dea187d23520 (patch)
treee13a4f8f797dda6bb03eb69fb6a6744433ec650a
parent3e9ac7e52541c6612146354b8d2d12badd45eec1 (diff)
downloadgcc-728da67271802eba3470cbe13025dea187d23520.zip
gcc-728da67271802eba3470cbe13025dea187d23520.tar.gz
gcc-728da67271802eba3470cbe13025dea187d23520.tar.bz2
re PR c++/28111 (ICE with invalid friend in template class)
PR c++/28111 * pt.c (determine_specialization): Check for invalid decls. * g++.dg/template/friend43.C: New test. From-SVN: r114887
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/friend43.C11
4 files changed, 18 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ac044d1..ec07436 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2006-06-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+ PR c++/28111
+ * pt.c (determine_specialization): Check for invalid decls.
+
PR c++/28110
* pt.c (unify) <case TEMPLATE_PARM_INDEX>: Check for invalid
parameters.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f7bc7ce..89afb5f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1354,7 +1354,7 @@ determine_specialization (tree template_id,
*targs_out = NULL_TREE;
- if (template_id == error_mark_node)
+ if (template_id == error_mark_node || decl == error_mark_node)
return error_mark_node;
fns = TREE_OPERAND (template_id, 0);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a02dc4c..013608b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2006-06-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+ PR c++/28111
+ * g++.dg/template/friend43.C: New test.
+
PR c++/28110
* g++.dg/template/crash53.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/friend43.C b/gcc/testsuite/g++.dg/template/friend43.C
new file mode 100644
index 0000000..edbed84
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/friend43.C
@@ -0,0 +1,11 @@
+// PR c++/28111
+// { dg-do compile }
+
+template<typename> void foo();
+
+template<typename T> struct A
+{
+ friend void foo<>(typename T::X); // { dg-error "not a class" }
+};
+
+A<int> a;