We don't want to promote a conversion from viable == 0 to viable == -1. Found in ranges-v3.
Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog 2020-02-28 Jason Merrill <ja...@redhat.com> * call.c (build_user_type_conversion_1): Don't look at the second conversion of a non-viable candidate. --- gcc/cp/call.c | 4 ++++ gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e07ee85c06e..85bbd043a1d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4083,6 +4083,10 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags, for (cand = candidates; cand != old_candidates; cand = cand->next) { + if (cand->viable == 0) + /* Already rejected, don't change to -1. */ + continue; + tree rettype = TREE_TYPE (TREE_TYPE (cand->fn)); conversion *ics = implicit_conversion (totype, diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C new file mode 100644 index 00000000000..aa29acbcb13 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target concepts } } + +template <class T> concept False = false; + +template <class T> +struct A +{ + explicit operator bool (); + explicit operator bool () requires False<T>; +}; + +int main() +{ + int i { A<int>() }; // { dg-error "" } +} base-commit: 77e596cf3c1b7bc11ba946394ed8d62a49157b49 -- 2.18.1