Index: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -451,7 +451,7 @@ NonLoc FromVal = val.castAs(); QualType CmpTy = getConditionType(); NonLoc CompVal = - evalBinOpNN(state, BO_LT, FromVal, ToTypeMaxVal, CmpTy).castAs(); + evalBinOpNN(state, BO_LE, FromVal, ToTypeMaxVal, CmpTy).castAs(); ProgramStateRef IsNotTruncated, IsTruncated; std::tie(IsNotTruncated, IsTruncated) = state->assume(CompVal); if (!IsNotTruncated && IsTruncated) { Index: cfe/trunk/test/Analysis/bool-assignment.c =================================================================== --- cfe/trunk/test/Analysis/bool-assignment.c +++ cfe/trunk/test/Analysis/bool-assignment.c @@ -42,6 +42,15 @@ BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} return; } + if (y > 200 && y < 250) { + // FIXME: Currently we are loosing this warning due to a SymbolCast in RHS. + BOOL x = y; // no-warning + return; + } + if (y >= 127 && y < 150) { + BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}} + return; + } if (y > 1) { BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} return;