c++: deducing only from noexcept-spec [PR80951]
authorPatrick Palka <ppalka@redhat.com>
Tue, 8 Feb 2022 14:11:31 +0000 (09:11 -0500)
committerPatrick Palka <ppalka@redhat.com>
Tue, 8 Feb 2022 14:11:31 +0000 (09:11 -0500)
The "fail-fast" predicate uses_deducible_template_parms used by
unify_one_argument is neglecting to look inside the noexcept-spec of a
function type.  This causes deduction to spuriously fail whenever the
noexcept-spec is the only part of the type which contains a deducible
template parameter.

PR c++/80951

gcc/cp/ChangeLog:

* pt.cc (uses_deducible_template_parms): Consider the
noexcept-spec of a function type.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/noexcept-type25.C: New test.

gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp1z/noexcept-type25.C [new file with mode: 0644]

index 5115fba..862f337 100644 (file)
@@ -22449,6 +22449,11 @@ uses_deducible_template_parms (tree type)
       for (; parm; parm = TREE_CHAIN (parm))
        if (uses_deducible_template_parms (TREE_VALUE (parm)))
          return true;
+      if (flag_noexcept_type
+         && TYPE_RAISES_EXCEPTIONS (type)
+         && TREE_PURPOSE (TYPE_RAISES_EXCEPTIONS (type))
+         && deducible_expression (TREE_PURPOSE (TYPE_RAISES_EXCEPTIONS (type))))
+       return true;
     }
 
   return false;
diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type25.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type25.C
new file mode 100644 (file)
index 0000000..ef5c826
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/80951
+// { dg-do compile { target c++17 } }
+
+void f() noexcept;
+void g();
+
+template<bool E>
+constexpr bool h(void (*)() noexcept(E)) {
+  return E;
+}
+
+static_assert(h(f));
+static_assert(!h(g));