diff options
author | Chris Lattner <sabre@nondot.org> | 2008-05-04 18:25:32 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-05-04 18:25:32 +0000 |
commit | d5214b22cccbc30ac2e07c44ef91e498f2046652 (patch) | |
tree | 400a2eb5dfb8a2ffff697c017f64cdb08ebca141 /lib/Lex/PPExpressions.cpp | |
parent | 2c62a1aa398d5582db00d2bad6b2d999ee50ec14 (diff) |
Fix PR2279 part C: shifts don't perform the UACs, thanks to Neil
for pointing this out.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50624 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PPExpressions.cpp')
-rw-r--r-- | lib/Lex/PPExpressions.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Lex/PPExpressions.cpp b/lib/Lex/PPExpressions.cpp index 6317015137..6343a3c098 100644 --- a/lib/Lex/PPExpressions.cpp +++ b/lib/Lex/PPExpressions.cpp @@ -409,9 +409,11 @@ static bool EvaluateDirectiveSubExpr(llvm::APSInt &LHS, unsigned MinPrec, assert(PeekPrec <= ThisPrec && "Recursion didn't work!"); // Usual arithmetic conversions (C99 6.3.1.8p1): result is unsigned if - // either operand is unsigned. Don't do this for x and y in "x ? y : z". + // either operand is unsigned. Don't do this for x and y in "x ? y : z" or + // for shifts. llvm::APSInt Res(LHS.getBitWidth()); - if (Operator != tok::question) { + if (Operator != tok::question && Operator != tok::lessless && + Operator != tok::greatergreater) { Res.setIsUnsigned(LHS.isUnsigned()|RHS.isUnsigned()); // If this just promoted something from signed to unsigned, and if the // value was negative, warn about it. |