]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: CWG 2789 and reversed operator candidates
authorPatrick Palka <ppalka@redhat.com>
Fri, 20 Sep 2024 19:41:42 +0000 (15:41 -0400)
committerPatrick Palka <ppalka@redhat.com>
Fri, 20 Sep 2024 19:41:42 +0000 (15:41 -0400)
As a follow-up to r15-3741-gee3efe06c9c49c, which was specifically
concerned with usings, it seems the CWG 2789 refinement should also
compare contexts of a reversed vs non-reversed (member) candidate
during operator overload resolution.

DR 2789

gcc/cp/ChangeLog:

* call.cc (cand_parms_match): Check for matching class contexts
even in the reversed case.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-memfun4.C: Adjust expected result
involving reversed candidate.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/call.cc
gcc/testsuite/g++.dg/cpp2a/concepts-memfun4.C

index f2ce50857ece06832c883ffc3079faaacc9a4f55..70783baac242c1b6b5e9e5e2afaa1ac7d98e01db 100644 (file)
@@ -12865,10 +12865,6 @@ cand_parms_match (z_candidate *c1, z_candidate *c2, pmatch match_kind)
        }
     }
 
-  else if (reversed)
-    return (reversed_match (c1, c2)
-           && reversed_match (c2, c1));
-
   tree parms1 = TYPE_ARG_TYPES (TREE_TYPE (fn1));
   tree parms2 = TYPE_ARG_TYPES (TREE_TYPE (fn2));
 
@@ -12880,6 +12876,10 @@ cand_parms_match (z_candidate *c1, z_candidate *c2, pmatch match_kind)
       if (base1 != base2)
        return false;
 
+      if (reversed)
+       return (reversed_match (c1, c2)
+               && reversed_match (c2, c1));
+
       /* Use object_parms_correspond to simplify comparing iobj/xobj/static
         member functions.  */
       if (!object_parms_correspond (fn1, fn2, base1))
@@ -12897,6 +12897,9 @@ cand_parms_match (z_candidate *c1, z_candidate *c2, pmatch match_kind)
       parms1 = skip_parms (fn1, parms1);
       parms2 = skip_parms (fn2, parms2);
     }
+  else if (reversed)
+    return (reversed_match (c1, c2)
+           && reversed_match (c2, c1));
   return compparms (parms1, parms2);
 }
 
index cf7f13c007d19d42f619590cbae704ccd06922f8..d849e9129a3b3935f5e5ad0eea7acb724e832935 100644 (file)
@@ -91,7 +91,7 @@ namespace N1 {
 
   A<> a;
   B<> b;
-  // when comparing the A op== to the reversed B op==, we compare them in
-  // reverse order, so they match, and we choose the more constrained.
-  static_assert (a == b);
+  // A op== and B op== are defined in different classes so constraints
+  // aren't considered, and the tie is broken via reversedness.
+  static_assert (!(a == b));
 }