The constexpr code only wants to preserve PTRMEM_CST in conversions if the conversions are only qualification conversions; dropping noexcept counts as a qualification adjustment in overload resolution, so let's include it here.
Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog: PR c++/90664 * cvt.c (can_convert_qual): Check fnptr_conv_p. gcc/testsuite/ChangeLog: PR c++/90664 * g++.dg/cpp1z/noexcept-type24.C: New test. --- gcc/cp/cvt.c | 5 +++++ gcc/testsuite/g++.dg/cpp1z/noexcept-type24.C | 22 ++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1z/noexcept-type24.C diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index d1051139e70..f1687e804d1 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -2013,6 +2013,11 @@ can_convert_qual (tree type, tree expr) tree expr_type = TREE_TYPE (expr); gcc_assert (!same_type_p (type, expr_type)); + /* A function pointer conversion also counts as a Qualification Adjustment + under [over.ics.scs]. */ + if (fnptr_conv_p (type, expr_type)) + return true; + if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type)) return comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type)); else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (expr_type)) diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type24.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type24.C new file mode 100644 index 00000000000..df16ea78641 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type24.C @@ -0,0 +1,22 @@ +// PR c++/90664 +// { dg-do compile { target c++11 } } + +template <typename TT, typename MFP, MFP> struct OpM; + +template <typename TR, typename TT, TR (TT::*f)()> +struct OpM<TT, TR (TT::*)(), f> +{}; + +class Class { +public: + int address() noexcept { return 0; } + void address(int) noexcept {} +}; + +struct Sk { + template <class C, typename R> Sk(R (C::*p)()) { + typedef OpM<C, R (C::*)() /* noexcept */, &Class::address> OP; + } +}; + +Sk sk(static_cast<int (Class::*)()>(&Class::address)); base-commit: 2a26351b598242c2fbce95d2a0baacce0084aec6 prerequisite-patch-id: ce32856d89f65f0543b5696d12c0de2014236a6e -- 2.27.0