зеркало из https://github.com/microsoft/clang.git
||/&& do not do UAC's either. This silences a bogus warning on #if -1 || 4U.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50632 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
463ec60993
Коммит
019ef7e102
|
@ -409,11 +409,17 @@ 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" or
|
||||
// for shifts.
|
||||
// either operand is unsigned.
|
||||
llvm::APSInt Res(LHS.getBitWidth());
|
||||
if (Operator != tok::question && Operator != tok::lessless &&
|
||||
Operator != tok::greatergreater && Operator != tok::comma) {
|
||||
switch (Operator) {
|
||||
case tok::question: // No UAC for x and y in "x ? y : z".
|
||||
case tok::lessless: // Shift amount doesn't UAC with shift value.
|
||||
case tok::greatergreater: // Shift amount doesn't UAC with shift value.
|
||||
case tok::comma: // Comma operands are not subject to UACs.
|
||||
case tok::pipepipe: // Logical || does not do UACs.
|
||||
case tok::ampamp: // Logical && does not do UACs.
|
||||
break; // No UAC
|
||||
default:
|
||||
Res.setIsUnsigned(LHS.isUnsigned()|RHS.isUnsigned());
|
||||
// If this just promoted something from signed to unsigned, and if the
|
||||
// value was negative, warn about it.
|
||||
|
|
Загрузка…
Ссылка в новой задаче