-
Notifications
You must be signed in to change notification settings - Fork 11.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[clang] p2085 out-of-class comparison operator defaulting
This implements p2085, allowing out-of-class defaulting of comparison operators, primarily so they need not be inline, IIUC intent. this was mostly straigh forward, but required reimplementing Sema::CheckExplicitlyDefaultedComparison, as now there's a case where we have no a priori clue as to what class a defaulted comparison may be for. We have to inspect the parameter types to find out. Eg: class X { ... }; bool operator==(X, X) = default; Thus reimplemented the parameter type checking, and added 'is this a friend' functionality for the above case. Reviewed By: mizvekov Differential Revision: https://reviews.llvm.org/D104478
- Loading branch information
Showing
5 changed files
with
221 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// RUN: %clang_cc1 --std=c++20 %s -emit-llvm -o - -triple x86_64-linux | FileCheck %s | ||
|
||
namespace std { | ||
struct strong_ordering { | ||
int n; | ||
constexpr operator int() const { return n; } | ||
static const strong_ordering equal, greater, less; | ||
}; | ||
constexpr inline strong_ordering strong_ordering::equal = {0}; | ||
constexpr inline strong_ordering strong_ordering::greater = {1}; | ||
constexpr inline strong_ordering strong_ordering::less = {-1}; | ||
} // namespace std | ||
|
||
struct Space { | ||
int i, j; | ||
|
||
std::strong_ordering operator<=>(Space const &other) const; | ||
bool operator==(Space const &other) const; | ||
}; | ||
|
||
// Make sure these cause emission | ||
std::strong_ordering Space::operator<=>(Space const &other) const = default; | ||
// CHECK-LABEL: define{{.*}} @_ZNK5SpacessERKS_ | ||
bool Space::operator==(Space const &) const = default; | ||
// CHECK-LABEL: define{{.*}} @_ZNK5SpaceeqERKS_ | ||
|
||
struct Water { | ||
int i, j; | ||
|
||
std::strong_ordering operator<=>(Water const &other) const; | ||
bool operator==(Water const &other) const; | ||
}; | ||
|
||
// Make sure these do not cause emission | ||
inline std::strong_ordering Water::operator<=>(Water const &other) const = default; | ||
// CHECK-NOT: define{{.*}} @_ZNK5WaterssERKS_ | ||
inline bool Water::operator==(Water const &) const = default; | ||
// CHECK-NOT: define{{.*}} @_ZNK5WatereqERKS_ |
Oops, something went wrong.