diff options
author | Jason Merrill <jason@redhat.com> | 2020-02-28 13:43:55 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-02-28 13:44:44 -0500 |
commit | 586b016cd48f5a5f6f2ba9f179105fabaa3e85dd (patch) | |
tree | 379a757243bef7feb91dd458350f7048ed4e3fa4 /gcc | |
parent | 4735f92d48c373031be296fd0f7a2cf31fc955da (diff) | |
download | gcc-586b016cd48f5a5f6f2ba9f179105fabaa3e85dd.zip gcc-586b016cd48f5a5f6f2ba9f179105fabaa3e85dd.tar.gz gcc-586b016cd48f5a5f6f2ba9f179105fabaa3e85dd.tar.bz2 |
c++: Fix constrained conversion op.
We don't want to promote a conversion from viable == 0 to viable == -1.
Found in ranges-v3.
gcc/cp/ChangeLog
2020-02-28 Jason Merrill <jason@redhat.com>
* call.c (build_user_type_conversion_1): Don't look at the second
conversion of a non-viable candidate.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C | 15 |
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4dc30e0..8a8de32 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-02-28 Jason Merrill <jason@redhat.com> + + * call.c (build_user_type_conversion_1): Don't look at the second + conversion of a non-viable candidate. + 2020-02-28 Jakub Jelinek <jakub@redhat.com> P1937R2 - Fixing inconsistencies between const{expr,eval} functions diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e07ee85..85bbd04 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 0000000..aa29acb --- /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 "" } +} |