diff options
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | 2 | ||||
-rw-r--r-- | clang/test/Analysis/svalbuilder-rearrange-comparisons.c | 5 |
2 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index b2224b5495b..4171ebf1368 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -469,6 +469,8 @@ static Optional<NonLoc> tryRearrange(ProgramStateRef State, // Initialize SingleTy later with a symbol's type. } else if (BinaryOperator::isAdditiveOp(Op)) { SingleTy = ResultTy; + if (LSym->getType() != SingleTy) + return None; // Substracting unsigned integers is a nightmare. if (!SingleTy->isSignedIntegerOrEnumerationType()) return None; diff --git a/clang/test/Analysis/svalbuilder-rearrange-comparisons.c b/clang/test/Analysis/svalbuilder-rearrange-comparisons.c index 47366d24456..720144c38ad 100644 --- a/clang/test/Analysis/svalbuilder-rearrange-comparisons.c +++ b/clang/test/Analysis/svalbuilder-rearrange-comparisons.c @@ -929,3 +929,8 @@ void overflow(signed char n, signed char m) { clang_analyzer_eval(n - 126 == m + 3); // expected-warning{{UNKNOWN}} } } + +int mixed_integer_types(int x, int y) { + short a = x - 1U; + return a - y; +} |