Skip to content

Commit

Permalink
[clang] __is_trivially_equality_comparable should return false for ar…
Browse files Browse the repository at this point in the history
…rays

When comparing two arrays, their pointers are compared instead of their elements, which means that they are not trivially equality comparable

Fixes #63371

Reviewed By: cor3ntin

Spies: cor3ntin, cfe-commits

Differential Revision: https://reviews.llvm.org/D153737
  • Loading branch information
philnik777 committed Jun 26, 2023
1 parent 0ab5970 commit 4de66e8
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
2 changes: 1 addition & 1 deletion clang/lib/AST/Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2684,7 +2684,7 @@ bool QualType::isTriviallyEqualityComparableType(
const ASTContext &Context) const {
QualType CanonicalType = getCanonicalType();
if (CanonicalType->isIncompleteType() || CanonicalType->isDependentType() ||
CanonicalType->isEnumeralType())
CanonicalType->isEnumeralType() || CanonicalType->isArrayType())
return false;

if (const auto *RD = CanonicalType->getAsCXXRecordDecl()) {
Expand Down
9 changes: 8 additions & 1 deletion clang/test/SemaCXX/type-traits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3110,7 +3110,7 @@ static_assert(!__is_trivially_equality_comparable(ForwardDeclared), ""); // expe
static_assert(!__is_trivially_equality_comparable(void), "");
static_assert(__is_trivially_equality_comparable(int), "");
static_assert(!__is_trivially_equality_comparable(int[]), "");
static_assert(__is_trivially_equality_comparable(int[3]), "");
static_assert(!__is_trivially_equality_comparable(int[3]), "");
static_assert(!__is_trivially_equality_comparable(float), "");
static_assert(!__is_trivially_equality_comparable(double), "");
static_assert(!__is_trivially_equality_comparable(long double), "");
Expand All @@ -3134,6 +3134,13 @@ struct TriviallyEqualityComparable {
};
static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable), "");

struct TriviallyEqualityComparableContainsArray {
int a[4];

bool operator==(const TriviallyEqualityComparableContainsArray&) const = default;
};
static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableContainsArray));

struct TriviallyEqualityComparableNonTriviallyCopyable {
TriviallyEqualityComparableNonTriviallyCopyable(const TriviallyEqualityComparableNonTriviallyCopyable&);
~TriviallyEqualityComparableNonTriviallyCopyable();
Expand Down

0 comments on commit 4de66e8

Please sign in to comment.