PR c++/84080 - ICE with return type deduction and specialization.
authorJason Merrill <jason@redhat.com>
Tue, 13 Feb 2018 15:57:00 +0000 (10:57 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 13 Feb 2018 15:57:00 +0000 (10:57 -0500)
* pt.c (determine_specialization): Check uses_template_parms.

From-SVN: r257630

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1y/auto-fn47.C [new file with mode: 0644]

index 3f37392061670a840d0294beef2a121c91777675..7c52edeeab6deca814e2b4776f8c67cb9b1b8a8f 100644 (file)
@@ -1,5 +1,8 @@
 2018-02-13  Jason Merrill  <jason@redhat.com>
 
+       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
index 02d448e99b67d1a866c064688d8b3485dd6a3aff..222084df4cbe722bac39efc6a21405bb8bcf5a5e 100644 (file)
@@ -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 (file)
index 0000000..7de2d9f
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/84080
+// { dg-do compile { target c++14 } }
+
+template <int i, typename T> T foo();
+
+template <> auto foo<0>() { return 42; } // { dg-error "does not match" }