[clang] [C++20] Fix a crash with spaceship and vector types (PR #139767)
via cfe-commits
cfe-commits at lists.llvm.org
Tue May 13 10:05:20 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Aaron Ballman (AaronBallman)
<details>
<summary>Changes</summary>
Vector types cannot be directly compared, you get an error when you try to do so. This patch causes the explicitly defaulted spaceship operator to be implicitly deleted.
Fixes #<!-- -->137452
---
Full diff: https://github.com/llvm/llvm-project/pull/139767.diff
3 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+3)
- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+5)
- (modified) clang/test/SemaCXX/cxx2a-three-way-comparison.cpp (+8)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index bc13d02e2d20b..3941eb51b00d7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -118,6 +118,9 @@ C++23 Feature Support
C++20 Feature Support
^^^^^^^^^^^^^^^^^^^^^
+- Fixed a crash with a defaulted spaceship (``<=>``) operator when the class
+ contains a member declaration of vector type. Vector types cannot yet be
+ compared directly, so this causes the operator to be deleted. (#GH137452)
C++17 Feature Support
^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index cbccb567e2adf..2f2ff2d471c71 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -8651,6 +8651,11 @@ class DefaultedComparisonAnalyzer
assert(Best->BuiltinParamTypes[2].isNull() &&
"invalid builtin comparison");
+ // FIXME: If the type we deduced is a vector type, we mark the
+ // comparison as deleted because we don't yet support this.
+ if (isa<VectorType>(T))
+ return Result::deleted();
+
if (NeedsDeducing) {
std::optional<ComparisonCategoryType> Cat =
getComparisonCategoryForBuiltinCmp(T);
diff --git a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
index b94225274fffb..36b603e4f7660 100644
--- a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
+++ b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
@@ -58,3 +58,11 @@ namespace PR44325 {
// implicit rewrite rules, not for explicit use by programs.
bool c = cmp_cat() < 0; // expected-warning {{zero as null pointer constant}}
}
+
+namespace GH137452 {
+struct comparable_t {
+ __attribute__((vector_size(32))) double numbers;
+ auto operator<=>(const comparable_t& rhs) const = default; // expected-warning {{explicitly defaulted three-way comparison operator is implicitly deleted}} \
+ expected-note {{replace 'default' with 'delete'}}
+};
+} // namespace GH137452
``````````
</details>
https://github.com/llvm/llvm-project/pull/139767
More information about the cfe-commits
mailing list