aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2016-09-19 18:12:36 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2016-09-19 18:12:36 +0000
commit6101a7ab878f784558c908d6e4773d49b0858e0e (patch)
tree418e0d7e8d09dbc87f2f70bec91de96afdb2fdff
parentd0f5943566482b094ac600e63271c22ebf227c5f (diff)
downloadgcc-6101a7ab878f784558c908d6e4773d49b0858e0e.zip
gcc-6101a7ab878f784558c908d6e4773d49b0858e0e.tar.gz
gcc-6101a7ab878f784558c908d6e4773d49b0858e0e.tar.bz2
Fix PR c++/77639 (ICE during error recovery)
gcc/cp/ChangeLog: PR c++/77639 * parser.c (cp_parser_class_head): When processing_template_parmlist, don't assume that the class-head may start an explicit specialization. gcc/testsuite/ChangeLog: PR c++/77639 * g++.dg/template/error-recovery4.C: New test. From-SVN: r240245
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/error-recovery4.C5
4 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9d74bdb..e4bd392 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2016-09-16 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/77639
+ * parser.c (cp_parser_class_head): When
+ processing_template_parmlist, don't assume that the
+ class-head may start an explicit specialization.
+
2016-09-16 Jakub Jelinek <jakub@redhat.com>
PR c++/77482
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index fb88021..c03b9c2 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -22025,6 +22025,7 @@ cp_parser_class_head (cp_parser* parser,
it is not, try to recover gracefully. */
if (at_namespace_scope_p ()
&& parser->num_template_parameter_lists == 0
+ && !processing_template_parmlist
&& template_id_p)
{
/* Build a location of this form:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 68d3973..f7d0048 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-19 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/77639
+ * g++.dg/template/error-recovery4.C: New test.
+
2016-09-19 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/vect/pr57558-1.c: Use unsigned int instead of unsigned long.
diff --git a/gcc/testsuite/g++.dg/template/error-recovery4.C b/gcc/testsuite/g++.dg/template/error-recovery4.C
new file mode 100644
index 0000000..1e52c6a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error-recovery4.C
@@ -0,0 +1,5 @@
+// PR c++/77639
+
+template <class, int, class, int> struct B {};
+template <class T, int a, class U struct B<T, a, U, 1> {}; // { dg-error "" }
+B<int, 2, char, 1> i;