From: Chris Lattner Date: Sun, 4 May 2008 18:25:32 +0000 (+0000) Subject: Fix PR2279 part C: shifts don't perform the UACs, thanks to Neil X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5214b22cccbc30ac2e07c44ef91e498f2046652;p=clang 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 --- 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. diff --git a/test/Preprocessor/expr_usual_conversions.c b/test/Preprocessor/expr_usual_conversions.c index b2ccc40900..90275c9944 100644 --- a/test/Preprocessor/expr_usual_conversions.c +++ b/test/Preprocessor/expr_usual_conversions.c @@ -6,3 +6,8 @@ foo #endif +// Shifts don't want the usual conversions: PR2279 +#if (2 << 1U) - 30 >= 0 +#error +#endif +