[PATCH] D103850: [clang] diagnose instead of assert for defaulted comparison return type deduction.
Matheus Izvekov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 7 15:30:48 PDT 2021
mizvekov created this revision.
mizvekov requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
When deducing the return type of defaulted three-way comparison, instead
of asserting in the case of unsupported builtin types, just diagnose it.
For now, we add a test case for function pointers which will produce
slightly incorrect diagnostics. In future work, we will stop adding
function pointers to the candidate set and get the correct diagnostics.
Signed-off-by: Matheus Izvekov <mizvekov at gmail.com>
Depends on D103760 <https://reviews.llvm.org/D103760>
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103850
Files:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
Index: clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
===================================================================
--- clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
+++ clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
@@ -191,4 +191,14 @@
a2 f;
};
std::partial_ordering cmp_b2 = b2() <=> b2();
+
+ struct a3 {
+ using fp = void (*)();
+ operator fp() const;
+ };
+ struct b3 {
+ auto operator<=>(b3 const &) const = default; // expected-error {{cannot be deduced because three-way comparison for member 'f' would compare as builtin type 'void (*)()' which is not currently supported}}
+ // expected-warning at -1 {{implicitly deleted}}
+ a3 f;
+ };
}
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -7868,7 +7868,15 @@
"invalid builtin comparison");
Optional<ComparisonCategoryType> Cat =
getComparisonCategoryForBuiltinCmp(T);
- assert(Cat && "no category for builtin comparison?");
+ if (!Cat) {
+ if (Diagnose == NoDiagnostics)
+ S.Diag(
+ FD->getLocation(),
+ diag::
+ err_defaulted_comparison_cannot_deduce_unsupported_builtin_type)
+ << Subobj.Kind << Subobj.Decl << T;
+ return Result::deleted();
+ }
R.Category = *Cat;
}
}
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9122,6 +9122,10 @@
"%select{|member|base class}0 %1 declared here">;
def note_defaulted_comparison_cannot_deduce_callee : Note<
"selected 'operator<=>' for %select{|member|base class}0 %1 declared here">;
+def err_defaulted_comparison_cannot_deduce_unsupported_builtin_type : Error<
+ "return type of defaulted 'operator<=>' cannot be deduced because "
+ "three-way comparison for %select{|member|base class}0 %1 "
+ "would compare as builtin type %2 which is not currently supported by clang">;
def err_incorrect_defaulted_comparison_constexpr : Error<
"defaulted definition of %select{%sub{select_defaulted_comparison_kind}1|"
"three-way comparison operator}0 "
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103850.350436.patch
Type: text/x-patch
Size: 2449 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210607/dac8eeac/attachment.bin>
More information about the cfe-commits
mailing list