https://github.com/AaronBallman updated 
https://github.com/llvm/llvm-project/pull/139767

>From 7249f9c5d4307aa3eb302bdd689fbf45ef7b9cc9 Mon Sep 17 00:00:00 2001
From: Aaron Ballman <aa...@aaronballman.com>
Date: Tue, 13 May 2025 13:02:13 -0400
Subject: [PATCH 1/2] [C++20] Fix a crash with spaceship and vector types

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
---
 clang/docs/ReleaseNotes.rst                       | 3 +++
 clang/lib/Sema/SemaDeclCXX.cpp                    | 5 +++++
 clang/test/SemaCXX/cxx2a-three-way-comparison.cpp | 8 ++++++++
 3 files changed, 16 insertions(+)

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

>From f40a2d14d7e2983e897156e4faeb135c01913cf6 Mon Sep 17 00:00:00 2001
From: Aaron Ballman <aa...@aaronballman.com>
Date: Tue, 13 May 2025 13:26:43 -0400
Subject: [PATCH 2/2] Report why it's deleted

---
 clang/include/clang/Basic/DiagnosticSemaKinds.td  | 3 +++
 clang/lib/Sema/SemaDeclCXX.cpp                    | 9 ++++++++-
 clang/test/SemaCXX/cxx2a-three-way-comparison.cpp | 5 +++--
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 3efe9593b8633..17c292412d18b 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -10176,6 +10176,9 @@ def 
note_defaulted_comparison_no_viable_function_synthesized : Note<
 def note_defaulted_comparison_not_rewritten_callee : Note<
   "defaulted %0 is implicitly deleted because this non-rewritten comparison "
   "function would be the best match for the comparison">;
+def note_defaulted_comparison_vector_types : Note<
+  "defaulted %0 is implicitly deleted because defaulted comparison of vector "
+  "types is not supported">;
 def note_defaulted_comparison_not_rewritten_conversion : Note<
   "defaulted %0 is implicitly deleted because a builtin comparison function "
   "using this conversion would be the best match for the comparison">;
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 2f2ff2d471c71..91bdaad242e6b 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -8653,8 +8653,15 @@ class DefaultedComparisonAnalyzer
 
         // 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))
+        if (isa<VectorType>(T)) {
+          if (Diagnose == ExplainDeleted) {
+            S.Diag(FD->getLocation(),
+                   diag::note_defaulted_comparison_vector_types)
+                << FD;
+            S.Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
+          }
           return Result::deleted();
+        }
 
         if (NeedsDeducing) {
           std::optional<ComparisonCategoryType> Cat =
diff --git a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp 
b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
index 36b603e4f7660..76007ff3913dd 100644
--- a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
+++ b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp
@@ -61,8 +61,9 @@ namespace PR44325 {
 
 namespace GH137452 {
 struct comparable_t {
-    __attribute__((vector_size(32))) double numbers;
+    __attribute__((vector_size(32))) double numbers;           // 
expected-note {{declared here}}
     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'}}
+                                                                  
expected-note {{replace 'default' with 'delete'}} \
+                                                                  
expected-note {{defaulted 'operator<=>' is implicitly deleted because defaulted 
comparison of vector types is not supported}}
 };
 } // namespace GH137452

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to