Overflow detection for +/-
llvm-svn: 39403
diff --git a/clang/Lex/PPExpressions.cpp b/clang/Lex/PPExpressions.cpp
index ecd7a54..4c17dd1 100644
--- a/clang/Lex/PPExpressions.cpp
+++ b/clang/Lex/PPExpressions.cpp
@@ -467,9 +467,19 @@
}
case tok::plus:
Res = LHS + RHS;
+ if (LHS.isUnsigned())
+ Overflow = Res.ult(LHS);
+ else if (LHS.isPositive() == RHS.isPositive() &&
+ Res.isPositive() != LHS.isPositive())
+ Overflow = true; // Overflow for signed addition.
break;
case tok::minus:
Res = LHS - RHS;
+ if (LHS.isUnsigned())
+ Overflow = Res.ugt(LHS);
+ else if (LHS.isPositive() != RHS.isPositive() &&
+ Res.isPositive() != LHS.isPositive())
+ Overflow = true; // Overflow for signed subtraction.
break;
case tok::lessequal:
Res = LHS <= RHS;