[analyzer] Fixing SVal::getType returns Null Type for NonLoc::ConcreteInt in boolean type
In method `TypeRetrievingVisitor::VisitConcreteInt`, `ASTContext::getIntTypeForBitwidth` is used to get the type for `ConcreteInt`s. However, the getter in ASTContext cannot handle the boolean type with the bit width of 1, which will make method `SVal::getType` return a Null `Type`. In this patch, a check for this case is added to fix this problem by returning the bool type directly when the bit width is 1. Differential Revision: https://reviews.llvm.org/D129737
This commit is contained in:
parent
74902cc96f
commit
32fe1a4be9
|
@ -136,6 +136,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) {
|
||||
|
|
|
@ -161,6 +161,7 @@ SVAL_TEST(GetConstType, R"(
|
|||
void foo() {
|
||||
int x = 42;
|
||||
int *y = nullptr;
|
||||
bool z = true;
|
||||
})") {
|
||||
SVal X = getByName("x");
|
||||
ASSERT_FALSE(X.getType(Context).isNull());
|
||||
|
@ -170,6 +171,10 @@ void foo() {
|
|||
ASSERT_FALSE(Y.getType(Context).isNull());
|
||||
expectSameSignAndBitWidth(Context.getUIntPtrType(), Y.getType(Context),
|
||||
Context);
|
||||
|
||||
SVal Z = getByName("z");
|
||||
ASSERT_FALSE(Z.getType(Context).isNull());
|
||||
EXPECT_EQ(Context.BoolTy, Z.getType(Context));
|
||||
}
|
||||
|
||||
SVAL_TEST(GetLocAsIntType, R"(
|
||||
|
|
Loading…
Reference in a new issue