From 600583ab730f6cedd762b0e46a14061e2a6e097c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 4 Apr 2018 12:42:55 -0400 Subject: [PATCH] PR c++/85135 - ICE with omitted template arguments. * decl.c (grokdeclarator): Catch deduced class type in trailing return type. From-SVN: r259092 --- gcc/cp/ChangeLog | 4 +++ gcc/cp/decl.c | 29 ++++++++++++------- .../g++.dg/cpp1z/class-deduction53.C | 10 +++++++ 3 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction53.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0f857449b8f..261bd06b74f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-04-04 Jason Merrill + 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. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1cc2cd16ccc..746084c9006 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 00000000000..6025dc47cf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction53.C @@ -0,0 +1,10 @@ +// PR c++/85135 +// { dg-do compile { target c++11 } } + +template struct A {}; + +auto foo() -> A; // { dg-error "A" } + +template struct B {}; + +auto foo() -> A; // { dg-error "A" } -- 2.30.2