aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2019-02-01 19:58:44 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2019-02-01 19:58:44 +0000
commita53a893b4fe04ec966a4ec178ee8f394426a5dad (patch)
treec7b2750b3f0cc06cf5e61cbc27076d19f5ed4c01
parente71ac163553c47c516d2d5e77ba5fedce6ceec47 (diff)
downloadgcc-a53a893b4fe04ec966a4ec178ee8f394426a5dad.zip
gcc-a53a893b4fe04ec966a4ec178ee8f394426a5dad.tar.gz
gcc-a53a893b4fe04ec966a4ec178ee8f394426a5dad.tar.bz2
PR c++/88325 - ICE with invalid out-of-line template member definition.
* parser.c (cp_parser_class_name): Don't call make_typename_type for overloads. * g++.dg/cpp2a/typename14.C: New test. From-SVN: r268455
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/typename14.C25
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ca3618e..f0545ae 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2019-02-01 Marek Polacek <polacek@redhat.com>
+
+ PR c++/88325 - ICE with invalid out-of-line template member definition.
+ * parser.c (cp_parser_class_name): Don't call make_typename_type
+ for overloads.
+
2019-02-01 Jakub Jelinek <jakub@redhat.com>
PR c++/87175
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 91c5ff4..ffecce4 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -23167,7 +23167,9 @@ cp_parser_class_name (cp_parser *parser,
decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
/* If this is a typename, create a TYPENAME_TYPE. */
- if (typename_p && decl != error_mark_node)
+ if (typename_p
+ && decl != error_mark_node
+ && !is_overloaded_fn (decl))
{
decl = make_typename_type (scope, decl, typename_type,
/*complain=*/tf_error);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cfcd4ce..1df9ba2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-01 Marek Polacek <polacek@redhat.com>
+
+ PR c++/88325 - ICE with invalid out-of-line template member definition.
+ * g++.dg/cpp2a/typename14.C: New test.
+
2019-02-01 Richard Biener <rguenther@suse.de>
PR middle-end/88597
diff --git a/gcc/testsuite/g++.dg/cpp2a/typename14.C b/gcc/testsuite/g++.dg/cpp2a/typename14.C
new file mode 100644
index 0000000..4750db3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/typename14.C
@@ -0,0 +1,25 @@
+// PR c++/88325
+// { dg-do compile { target c++2a } }
+
+template<typename> struct A
+{
+ template<typename> A ();
+};
+
+template<typename T>
+template<typename U>
+A<T>::A<U> () // { dg-error "partial specialization" }
+{
+}
+
+template<typename> struct B
+{
+ template<typename> int foo (int);
+};
+
+template<typename T>
+template<typename U>
+B<T>::foo<int>(int) // { dg-error "partial specialization|declaration" }
+{
+ return 1;
+}