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
This commit is contained in:
Chris Lattner 2008-05-04 18:25:32 +00:00
Родитель 2c62a1aa39
Коммит d5214b22cc
2 изменённых файлов: 9 добавлений и 2 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -6,3 +6,8 @@
foo
#endif
// Shifts don't want the usual conversions: PR2279
#if (2 << 1U) - 30 >= 0
#error
#endif