PR c++/85135 - ICE with omitted template arguments.
authorJason Merrill <jason@redhat.com>
Wed, 4 Apr 2018 16:42:55 +0000 (12:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 4 Apr 2018 16:42:55 +0000 (12:42 -0400)
* decl.c (grokdeclarator): Catch deduced class type in trailing
return type.

From-SVN: r259092

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp1z/class-deduction53.C [new file with mode: 0644]

index 0f857449b8f0bf8078e04af4d943e458d353f8b1..261bd06b74f42623ef8b4e24884cc55d0c2f0754 100644 (file)
@@ -1,5 +1,9 @@
 2018-04-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/85135 - ICE with omitted template arguments.
+       * decl.c (grokdeclarator): Catch deduced class type in trailing
+       return type.
+
        PR c++/85133 - ICE with missing concept initializer.
        * decl.c (cp_finish_decl): If a concept initializer is missing, use
        true.
index 1cc2cd16ccc1f8d5787f19fed37df1b55d9c5217..746084c90067f60abccb485517672f7d73b2b23c 100644 (file)
@@ -11100,20 +11100,29 @@ grokdeclarator (const cp_declarator *declarator,
                               name, type);
                        return error_mark_node;
                      }
-                   if (tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node))
+                   tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node);
+                   if (!tmpl)
+                     if (tree late_auto = type_uses_auto (late_return_type))
+                       tmpl = CLASS_PLACEHOLDER_TEMPLATE (late_auto);
+                   if (tmpl)
                      {
-                       if (!late_return_type)
+                       if (!dguide_name_p (unqualified_id))
                          {
-                           if (dguide_name_p (unqualified_id))
-                             error_at (declarator->id_loc, "deduction guide "
-                                       "for %qT must have trailing return "
-                                       "type", TREE_TYPE (tmpl));
-                           else
-                             error_at (declarator->id_loc, "deduced class "
-                                       "type %qT in function return type",
-                                       type);
+                           error_at (declarator->id_loc, "deduced class "
+                                     "type %qD in function return type",
+                                     DECL_NAME (tmpl));
                            inform (DECL_SOURCE_LOCATION (tmpl),
                                    "%qD declared here", tmpl);
+                           return error_mark_node;
+                         }
+                       else if (!late_return_type)
+                         {
+                           error_at (declarator->id_loc, "deduction guide "
+                                     "for %qT must have trailing return "
+                                     "type", TREE_TYPE (tmpl));
+                           inform (DECL_SOURCE_LOCATION (tmpl),
+                                   "%qD declared here", tmpl);
+                           return error_mark_node;
                          }
                        else if (CLASS_TYPE_P (late_return_type)
                                 && CLASSTYPE_TEMPLATE_INFO (late_return_type)
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction53.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction53.C
new file mode 100644 (file)
index 0000000..6025dc4
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/85135
+// { dg-do compile { target c++11 } }
+
+template<int> struct A {};
+
+auto foo() -> A;               // { dg-error "A" }
+
+template<typename> struct B {};
+
+auto foo() -> A;               // { dg-error "A" }