From: Chris Lattner Date: Thu, 3 Jul 2008 03:47:30 +0000 (+0000) Subject: Fix PR2252: don't warn on negating an unsigned value ever, and don't emit X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b081a350b5cad21e5cbea74c618701e8b839c4f6;p=clang Fix PR2252: don't warn on negating an unsigned value ever, and don't emit 'integer constant is so large that it is unsigned' warning for hex literals. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53070 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PPExpressions.cpp b/lib/Lex/PPExpressions.cpp index 5f11df0893..2a4794de83 100644 --- a/lib/Lex/PPExpressions.cpp +++ b/lib/Lex/PPExpressions.cpp @@ -198,7 +198,8 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, // large that it is unsigned" e.g. on 12345678901234567890 where intmax_t // is 64-bits. if (!Literal.isUnsigned && Result.Val.isNegative()) { - if (ValueLive) + // Don't warn for a hex literal: 0x8000..0 shouldn't warn. + if (ValueLive && Literal.getRadix() != 16) PP.Diag(PeekTok, diag::warn_integer_too_large_for_signed); Result.Val.setIsUnsigned(true); } @@ -288,11 +289,8 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, // C99 6.5.3.3p3: The sign of the result matches the sign of the operand. Result.Val = -Result.Val; - bool Overflow = false; - if (Result.isUnsigned()) - Overflow = Result.Val.isNegative(); - else if (Result.Val.isMinSignedValue()) - Overflow = true; // -MININT is the only thing that overflows. + // -MININT is the only thing that overflows. Unsigned never overflows. + bool Overflow = !Result.isUnsigned() && Result.Val.isMinSignedValue(); // If this operator is live and overflowed, report the issue. if (Overflow && ValueLive) diff --git a/test/Lexer/number.c b/test/Lexer/number.c index e48816e405..bafbc022d5 100644 --- a/test/Lexer/number.c +++ b/test/Lexer/number.c @@ -1,6 +1,9 @@ // RUN: clang %s -fsyntax-only float X = 1.17549435e-38F; - float Y = 08.123456; +// PR2252 +#if -0x8000000000000000 // should not warn. +#endif +