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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits