aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-10-16 22:21:59 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-10-16 22:21:59 +0000
commitbf98d3b6c0453c71f0659848e7673ebc2cc3ee0c (patch)
tree97b55cff8bc838f31c3e48ad95b51197be294f48 /gcc
parent7aa1cb97ebbf4335d60c04543b7de6e935c22148 (diff)
downloadgcc-bf98d3b6c0453c71f0659848e7673ebc2cc3ee0c.zip
gcc-bf98d3b6c0453c71f0659848e7673ebc2cc3ee0c.tar.gz
gcc-bf98d3b6c0453c71f0659848e7673ebc2cc3ee0c.tar.bz2
re PR c++/31446 (ICE with invalid template parameter)
/cp 2007-10-16 Paolo Carlini <pcarlini@suse.de> PR c++/31446 * pt.c (current_template_args): Do not change TREE_LIST elements with a TREE_VALUE of error_mark_node. /testsuite 2007-10-16 Paolo Carlini <pcarlini@suse.de> PR c++/31446 * g++.dg/template/void11.C: New. * g++.dg/template/void2.C: Adjust error markers. * g++.dg/template/void10.C: Likewise. * g++.dg/template/crash55.C: Likewise. From-SVN: r129391
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/template/crash55.C2
-rw-r--r--gcc/testsuite/g++.dg/template/void10.C2
-rw-r--r--gcc/testsuite/g++.dg/template/void11.C12
-rw-r--r--gcc/testsuite/g++.dg/template/void2.C4
7 files changed, 31 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 559226b..5fd1c1b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-16 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/31446
+ * pt.c (current_template_args): Do not change TREE_LIST elements
+ with a TREE_VALUE of error_mark_node.
+
2007-10-16 Mark Mitchell <mark@codesourcery.com>
* typeck.c (cp_apply_type_quals_to_decl): Expand documentation.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index c3ce0d1..773c104 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3136,8 +3136,8 @@ current_template_args (void)
TREE_TYPE (t) = type;
}
}
+ TREE_VEC_ELT (a, i) = t;
}
- TREE_VEC_ELT (a, i) = t;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3535b31..34f8c08 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2007-10-16 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/31446
+ * g++.dg/template/void11.C: New.
+ * g++.dg/template/void2.C: Adjust error markers.
+ * g++.dg/template/void10.C: Likewise.
+ * g++.dg/template/crash55.C: Likewise.
+
2007-10-16 Mark Mitchell <mark@codesourcery.com>
* g++.dg/opt/const5.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/crash55.C b/gcc/testsuite/g++.dg/template/crash55.C
index 377603d..7cf9f1e 100644
--- a/gcc/testsuite/g++.dg/template/crash55.C
+++ b/gcc/testsuite/g++.dg/template/crash55.C
@@ -1,6 +1,6 @@
//PR c++/27668
template<typename class T, T = T()> // { dg-error "nested-name-specifier|two or more|valid type" }
-struct A {}; // { dg-error "definition|template" }
+struct A {};
template<int> void foo(A<int>); // { dg-error "mismatch|constant|template argument" }
diff --git a/gcc/testsuite/g++.dg/template/void10.C b/gcc/testsuite/g++.dg/template/void10.C
index 56e0b6d..4904a28 100644
--- a/gcc/testsuite/g++.dg/template/void10.C
+++ b/gcc/testsuite/g++.dg/template/void10.C
@@ -7,4 +7,4 @@ template<void> struct A // { dg-error "not a valid type" }
template<typename> struct B {};
-B<int> b; // { dg-error "template argument|invalid type" }
+B<int> b;
diff --git a/gcc/testsuite/g++.dg/template/void11.C b/gcc/testsuite/g++.dg/template/void11.C
new file mode 100644
index 0000000..1aad7a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/void11.C
@@ -0,0 +1,12 @@
+// PR c++/31446
+
+template<void> struct A // { dg-error "valid type" }
+
+{
+ template<int> friend void foo();
+};
+
+void bar()
+{
+ foo<0>(); // { dg-error "not declared|primary-expression" }
+}
diff --git a/gcc/testsuite/g++.dg/template/void2.C b/gcc/testsuite/g++.dg/template/void2.C
index 05a8186..eceb362 100644
--- a/gcc/testsuite/g++.dg/template/void2.C
+++ b/gcc/testsuite/g++.dg/template/void2.C
@@ -3,7 +3,7 @@
template<int> struct A
{
- template<void> friend class X; // { dg-error "void" }
+ template<void> friend class X; // { dg-error "void|valid type" }
};
-A<0> a;
+A<0> a;