Author: Valeriy Savchenko Date: 2021-04-08T20:28:05+03:00 New Revision: 4b958dd6bccab386be432cac99332b867ab9ee22
URL: https://github.com/llvm/llvm-project/commit/4b958dd6bccab386be432cac99332b867ab9ee22 DIFF: https://github.com/llvm/llvm-project/commit/4b958dd6bccab386be432cac99332b867ab9ee22.diff LOG: [analyzer] Fix crash on spaceship operator (PR47511) rdar://68954187 Differential Revision: https://reviews.llvm.org/D99181 Added: clang/test/Analysis/PR47511.cpp Modified: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index a47a28e1e866..9942b7e1423c 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -423,6 +423,14 @@ SVal SValBuilder::evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op, return UnknownVal(); } + if (op == BinaryOperatorKind::BO_Cmp) { + // We can't reason about C++20 spaceship operator yet. + // + // FIXME: Support C++20 spaceship operator. + // The main problem here is that the result is not integer. + return UnknownVal(); + } + if (Optional<Loc> LV = lhs.getAs<Loc>()) { if (Optional<Loc> RV = rhs.getAs<Loc>()) return evalBinOpLL(state, op, *LV, *RV, type); diff --git a/clang/test/Analysis/PR47511.cpp b/clang/test/Analysis/PR47511.cpp new file mode 100644 index 000000000000..d42799f4fbde --- /dev/null +++ b/clang/test/Analysis/PR47511.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_analyze_cc1 -std=c++20 -w -analyzer-checker=core -verify %s + +// expected-no-diagnostics + +namespace std { +struct strong_ordering { + int n; + constexpr operator int() const { return n; } + static const strong_ordering equal, greater, less; +}; +constexpr strong_ordering strong_ordering::equal = {0}; +constexpr strong_ordering strong_ordering::greater = {1}; +constexpr strong_ordering strong_ordering::less = {-1}; +} // namespace std + +void test() { + // no crash + (void)(0 <=> 0); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits