aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-02-28 13:43:55 -0500
committerJason Merrill <jason@redhat.com>2020-02-28 13:44:44 -0500
commit586b016cd48f5a5f6f2ba9f179105fabaa3e85dd (patch)
tree379a757243bef7feb91dd458350f7048ed4e3fa4 /gcc
parent4735f92d48c373031be296fd0f7a2cf31fc955da (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-conv1.C15
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 "" }
+}