aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/StaticAnalyzer/Core/SVals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/SVals.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/SVals.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/SVals.cpp b/clang/lib/StaticAnalyzer/Core/SVals.cpp
index 67913a55b3dc..31725926cd0d 100644
--- a/clang/lib/StaticAnalyzer/Core/SVals.cpp
+++ b/clang/lib/StaticAnalyzer/Core/SVals.cpp
@@ -109,6 +109,14 @@ SymbolRef SVal::getAsSymbol(bool IncludeBaseRegions) const {
return getAsLocSymbol(IncludeBaseRegions);
}
+const llvm::APSInt *SVal::getAsInteger() const {
+ if (auto CI = getAs<nonloc::ConcreteInt>())
+ return &CI->getValue();
+ if (auto CI = getAs<loc::ConcreteInt>())
+ return &CI->getValue();
+ return nullptr;
+}
+
const MemRegion *SVal::getAsRegion() const {
if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>())
return X->getRegion();
@@ -136,6 +144,8 @@ public:
}
template <class ConcreteInt> QualType VisitConcreteInt(ConcreteInt CI) {
const llvm::APSInt &Value = CI.getValue();
+ if (1 == Value.getBitWidth())
+ return Context.BoolTy;
return Context.getIntTypeForBitwidth(Value.getBitWidth(), Value.isSigned());
}
QualType VisitLocConcreteInt(loc::ConcreteInt CI) {