diff --git a/clang/lib/StaticAnalyzer/Core/SVals.cpp b/clang/lib/StaticAnalyzer/Core/SVals.cpp --- a/clang/lib/StaticAnalyzer/Core/SVals.cpp +++ b/clang/lib/StaticAnalyzer/Core/SVals.cpp @@ -136,6 +136,8 @@ } template 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) { diff --git a/clang/unittests/StaticAnalyzer/SValTest.cpp b/clang/unittests/StaticAnalyzer/SValTest.cpp --- a/clang/unittests/StaticAnalyzer/SValTest.cpp +++ b/clang/unittests/StaticAnalyzer/SValTest.cpp @@ -161,6 +161,7 @@ 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 @@ 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"(