diff --git a/clang/Lex/PPExpressions.cpp b/clang/Lex/PPExpressions.cpp index ecd7a54ac91e..4c17dd1be8b5 100644 --- a/clang/Lex/PPExpressions.cpp +++ b/clang/Lex/PPExpressions.cpp @@ -467,9 +467,19 @@ static bool EvaluateDirectiveSubExpr(APSInt &LHS, unsigned MinPrec, } 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;