From: Patrick Palka Date: Tue, 8 Feb 2022 14:11:31 +0000 (-0500) Subject: c++: deducing only from noexcept-spec [PR80951] X-Git-Tag: basepoints/gcc-13~1209 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=676e987b850a7352ece750a8f3a1ac5dae6b3627;p=thirdparty%2Fgcc.git c++: deducing only from noexcept-spec [PR80951] 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. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 5115fba8d0fb..862f337886c2 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -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 index 000000000000..ef5c8265541b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type25.C @@ -0,0 +1,13 @@ +// PR c++/80951 +// { dg-do compile { target c++17 } } + +void f() noexcept; +void g(); + +template +constexpr bool h(void (*)() noexcept(E)) { + return E; +} + +static_assert(h(f)); +static_assert(!h(g));