File tree Expand file tree Collapse file tree 4 files changed +27
-0
lines changed Expand file tree Collapse file tree 4 files changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -120,6 +120,9 @@ C++23 Feature Support
120
120
121
121
C++20 Feature Support
122
122
^^^^^^^^^^^^^^^^^^^^^
123
+ - Fixed a crash with a defaulted spaceship (``<=> ``) operator when the class
124
+ contains a member declaration of vector type. Vector types cannot yet be
125
+ compared directly, so this causes the operator to be deleted. (#GH137452)
123
126
124
127
C++17 Feature Support
125
128
^^^^^^^^^^^^^^^^^^^^^
Original file line number Diff line number Diff line change @@ -10185,6 +10185,9 @@ def note_defaulted_comparison_no_viable_function_synthesized : Note<
10185
10185
def note_defaulted_comparison_not_rewritten_callee : Note<
10186
10186
"defaulted %0 is implicitly deleted because this non-rewritten comparison "
10187
10187
"function would be the best match for the comparison">;
10188
+ def note_defaulted_comparison_vector_types : Note<
10189
+ "defaulted %0 is implicitly deleted because defaulted comparison of vector "
10190
+ "types is not supported">;
10188
10191
def note_defaulted_comparison_not_rewritten_conversion : Note<
10189
10192
"defaulted %0 is implicitly deleted because a builtin comparison function "
10190
10193
"using this conversion would be the best match for the comparison">;
Original file line number Diff line number Diff line change @@ -8651,6 +8651,18 @@ class DefaultedComparisonAnalyzer
8651
8651
assert(Best->BuiltinParamTypes[2].isNull() &&
8652
8652
"invalid builtin comparison");
8653
8653
8654
+ // FIXME: If the type we deduced is a vector type, we mark the
8655
+ // comparison as deleted because we don't yet support this.
8656
+ if (isa<VectorType>(T)) {
8657
+ if (Diagnose == ExplainDeleted) {
8658
+ S.Diag(FD->getLocation(),
8659
+ diag::note_defaulted_comparison_vector_types)
8660
+ << FD;
8661
+ S.Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8662
+ }
8663
+ return Result::deleted();
8664
+ }
8665
+
8654
8666
if (NeedsDeducing) {
8655
8667
std::optional<ComparisonCategoryType> Cat =
8656
8668
getComparisonCategoryForBuiltinCmp(T);
Original file line number Diff line number Diff line change @@ -58,3 +58,12 @@ namespace PR44325 {
58
58
// implicit rewrite rules, not for explicit use by programs.
59
59
bool c = cmp_cat() < 0 ; // expected-warning {{zero as null pointer constant}}
60
60
}
61
+
62
+ namespace GH137452 {
63
+ struct comparable_t {
64
+ __attribute__ ((vector_size(32 ))) double numbers; // expected-note {{declared here}}
65
+ auto operator <=>(const comparable_t & rhs) const = default ; // expected-warning {{explicitly defaulted three-way comparison operator is implicitly deleted}} \
66
+ expected-note {{replace 'default' with 'delete'}} \
67
+ expected-note {{defaulted 'operator<=>' is implicitly deleted because defaulted comparison of vector types is not supported}}
68
+ };
69
+ } // namespace GH137452
You can’t perform that action at this time.
0 commit comments