diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h @@ -571,4 +571,28 @@ } // namespace ento } // namespace clang +namespace llvm { +template +struct CastInfo< + To, From, + std::enable_if_t::value>> + : public CastIsPossible { + using Self = CastInfo< + To, From, + std::enable_if_t::value>>; + static bool isPossible(const From &V) { + return To::classof(*static_cast(&V)); + } + static Optional castFailed() { return Optional{}; } + static Optional doCast(const From &f) { + return *static_cast(cast<::clang::ento::SVal>(&f)); + } + static Optional doCastIfPossible(const From &f) { + if (!Self::isPossible(f)) + return Self::castFailed(); + return doCast(f); + } +}; +} // namespace llvm + #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALS_H