diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3f373920616..7c52edeeab6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2018-02-13 Jason Merrill + PR c++/84080 - ICE with return type deduction and specialization. + * pt.c (determine_specialization): Check uses_template_parms. + Fix more variadic capture issues. * pt.c (find_parameter_packs_r): Also look at explicit captures. (check_for_bare_parameter_packs): Check current_class_type for diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 02d448e99b6..222084df4cb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2203,6 +2203,11 @@ determine_specialization (tree template_id, specialize TMPL will produce DECL. */ continue; + if (uses_template_parms (targs)) + /* We deduced something involving 'auto', which isn't a valid + template argument. */ + continue; + /* Remove, from the set of candidates, all those functions whose constraints are not satisfied. */ if (flag_concepts && !constraints_satisfied_p (fn, targs)) diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn47.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn47.C new file mode 100644 index 00000000000..7de2d9f9e5c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn47.C @@ -0,0 +1,6 @@ +// PR c++/84080 +// { dg-do compile { target c++14 } } + +template T foo(); + +template <> auto foo<0>() { return 42; } // { dg-error "does not match" }