PR c++/88325 - ICE with invalid out-of-line template member definition.
authorMarek Polacek <polacek@redhat.com>
Fri, 1 Feb 2019 19:58:44 +0000 (19:58 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 1 Feb 2019 19:58:44 +0000 (19:58 +0000)
* parser.c (cp_parser_class_name): Don't call make_typename_type
for overloads.

* g++.dg/cpp2a/typename14.C: New test.

From-SVN: r268455

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/typename14.C [new file with mode: 0644]

index ca3618ee0601afbe0bc0c07c2a81fe7039e0a18a..f0545aee116804286201f1189ae3352f54015a55 100644 (file)
@@ -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
index 91c5ff42fadb2aa8c0acd3da2f5964339f0b3a9c..ffecce4e29b2e17aae6e8cd39ff11e72dcc9a1c8 100644 (file)
@@ -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);
index cfcd4ce19bc6fb42e675c40ab36a74d1456eec05..1df9ba2674d62c4b336afdb88925e4e424d8b8c4 100644 (file)
@@ -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 (file)
index 0000000..4750db3
--- /dev/null
@@ -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;
+}