Index: lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp =================================================================== --- lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -1291,6 +1291,17 @@ if (I != Cached.end()) return I->second; + // For now don't try to simplify mixed Loc/NonLoc expressions + // because they often appear from LocAsInteger operations + // and we don't know how to combine a LocAsInteger + // with a concrete value. + if (Loc::isLocType(S->getLHS()->getType()) != + Loc::isLocType(S->getRHS()->getType())) { + SVal V = SVB.makeSymbolVal(S); + Cached[S] = V; + return V; + } + SVal LHS = Visit(S->getLHS()); SVal RHS = Visit(S->getRHS()); if (isUnchanged(S->getLHS(), LHS) && isUnchanged(S->getRHS(), RHS)) { Index: test/Analysis/casts.c =================================================================== --- test/Analysis/casts.c +++ test/Analysis/casts.c @@ -175,3 +175,10 @@ void testLocNonLocSymbolAssume(int a, int *b) { if ((int)b < a) {} } + +void testLocNonLocSymbolRemainder(int a, int *b) { + int c = ((int)b) % a; + if (a == 1) { + c += 1; + } +}