[clang] [Clang] Fix __is_trivially_equality_comparable returning true with ineligebile defaulted overloads (PR #93113)

Nikolas Klauser via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 27 09:00:07 PDT 2024


================
@@ -1126,9 +1126,6 @@ class QualType {
   /// Return true if this is a trivially relocatable type.
   bool isTriviallyRelocatableType(const ASTContext &Context) const;
 
-  /// Return true if this is a trivially equality comparable type.
-  bool isTriviallyEqualityComparableType(const ASTContext &Context) const;
----------------
philnik777 wrote:

The main problem with this is that you don't have to have a member. Take this test case for example:
```c++
struct NotTriviallyEqualityComparableMoreConstrainedExternalOp {
  int i;
  bool operator==(const NotTriviallyEqualityComparableMoreConstrainedExternalOp&) const = default;
};

bool operator==(const NotTriviallyEqualityComparableMoreConstrainedExternalOp&,
                const NotTriviallyEqualityComparableMoreConstrainedExternalOp&) __attribute__((enable_if(true, ""))) {}

static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableMoreConstrainedExternalOp));
```
I'm sure this can also be written with some `requires` clause. Without the builtin telling the library there is no way to figure out that a free function instead of the member is called.


https://github.com/llvm/llvm-project/pull/93113


More information about the cfe-commits mailing list