From 446867ee4e831ba8df0bbe46762e57b20993c035 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Tue, 22 Jul 2014 14:08:09 +0000 Subject: [PATCH] Provide extra information in the "integer constant is too large" diagnostic. This will be used to improve other diagnostics. llvm-svn: 213657 --- clang/include/clang/Basic/DiagnosticCommonKinds.td | 4 ++-- clang/lib/Lex/PPExpressions.cpp | 7 +++++-- clang/lib/Sema/SemaExpr.cpp | 9 ++++++--- clang/test/CXX/lex/lex.literal/lex.ext/p3.cpp | 2 +- clang/test/Lexer/constants.c | 4 ++-- clang/test/Sema/128bitint.c | 4 ++-- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index b3c77b8..dc40998 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -103,9 +103,9 @@ def warn_cxx98_compat_longlong : Warning< "'long long' is incompatible with C++98">, InGroup, DefaultIgnore; def err_integer_too_large : Error< - "integer constant is larger than the largest unsigned integer type">; + "integer constant is larger than the largest %0-bit unsigned integer type">; def ext_integer_too_large_for_signed : ExtWarn< - "integer constant is larger than the largest signed integer type">, + "integer constant is larger than the largest %0-bit signed integer type">, InGroup>; // Sema && AST diff --git a/clang/lib/Lex/PPExpressions.cpp b/clang/lib/Lex/PPExpressions.cpp index 2260bf9..672140b 100644 --- a/clang/lib/Lex/PPExpressions.cpp +++ b/clang/lib/Lex/PPExpressions.cpp @@ -244,7 +244,9 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, // Parse the integer literal into Result. if (Literal.GetIntegerValue(Result.Val)) { // Overflow parsing integer literal. - if (ValueLive) PP.Diag(PeekTok, diag::err_integer_too_large); + if (ValueLive) + PP.Diag(PeekTok, diag::err_integer_too_large) + << Result.Val.getBitWidth(); Result.Val.setIsUnsigned(true); } else { // Set the signedness of the result to match whether there was a U suffix @@ -259,7 +261,8 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, // Octal, hexadecimal, and binary literals are implicitly unsigned if // the value does not fit into a signed integer type. if (ValueLive && Literal.getRadix() == 10) - PP.Diag(PeekTok, diag::ext_integer_too_large_for_signed); + PP.Diag(PeekTok, diag::ext_integer_too_large_for_signed) + << Result.Val.getBitWidth(); Result.Val.setIsUnsigned(true); } } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 35dad82..3062e42 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3117,7 +3117,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { } else { llvm::APInt ResultVal(Context.getTargetInfo().getLongLongWidth(), 0); if (Literal.GetIntegerValue(ResultVal)) - Diag(Tok.getLocation(), diag::err_integer_too_large); + Diag(Tok.getLocation(), diag::err_integer_too_large) + << ResultVal.getBitWidth(); Lit = IntegerLiteral::Create(Context, ResultVal, CookedTy, Tok.getLocation()); } @@ -3210,7 +3211,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { if (Literal.GetIntegerValue(ResultVal)) { // If this value didn't fit into uintmax_t, error and force to ull. - Diag(Tok.getLocation(), diag::err_integer_too_large); + Diag(Tok.getLocation(), diag::err_integer_too_large) + << ResultVal.getBitWidth(); Ty = Context.UnsignedLongLongTy; assert(Context.getTypeSize(Ty) == ResultVal.getBitWidth() && "long long is not intmax_t?"); @@ -3290,7 +3292,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { // If we still couldn't decide a type, we probably have something that // does not fit in a signed long long, but has no U suffix. if (Ty.isNull()) { - Diag(Tok.getLocation(), diag::ext_integer_too_large_for_signed); + Diag(Tok.getLocation(), diag::ext_integer_too_large_for_signed) + << ResultVal.getBitWidth(); Ty = Context.UnsignedLongLongTy; Width = Context.getTargetInfo().getLongLongWidth(); } diff --git a/clang/test/CXX/lex/lex.literal/lex.ext/p3.cpp b/clang/test/CXX/lex/lex.literal/lex.ext/p3.cpp index e812ddd..bfbb232 100644 --- a/clang/test/CXX/lex/lex.literal/lex.ext/p3.cpp +++ b/clang/test/CXX/lex/lex.literal/lex.ext/p3.cpp @@ -9,7 +9,7 @@ int &i2 = 45_x1; template char &operator "" _x1 (); int &i3 = 0377_x1; -int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-error {{integer constant is larger than the largest unsigned integer type}} +int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} double &operator "" _x2 (const char *); double &i5 = 123123123123123123123123123123123123123123123_x2; diff --git a/clang/test/Lexer/constants.c b/clang/test/Lexer/constants.c index f0cd4d7..a04d586 100644 --- a/clang/test/Lexer/constants.c +++ b/clang/test/Lexer/constants.c @@ -15,9 +15,9 @@ float Y = 08.123456; #endif #if -01000000000000000000000 // should not warn. #endif -#if 9223372036854775808 // expected-warning {{integer constant is larger than the largest signed integer type}} +#if 9223372036854775808 // expected-warning {{integer constant is larger than the largest 64-bit signed integer type}} #endif -#if 0x10000000000000000 // expected-error {{integer constant is larger than the largest unsigned integer type}} +#if 0x10000000000000000 // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} #endif int c[] = { diff --git a/clang/test/Sema/128bitint.c b/clang/test/Sema/128bitint.c index 4272b2d..f1ec05e 100644 --- a/clang/test/Sema/128bitint.c +++ b/clang/test/Sema/128bitint.c @@ -16,10 +16,10 @@ __uint128_t b = (__uint128_t)-1; __int128 i = (__int128)0; unsigned __int128 u = (unsigned __int128)-1; -long long SignedTooBig = 123456789012345678901234567890; // expected-error {{constant is larger than the largest unsigned integer type}} +long long SignedTooBig = 123456789012345678901234567890; // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} __int128_t Signed128 = 123456789012345678901234567890i128; long long Signed64 = 123456789012345678901234567890i128; // expected-warning {{implicit conversion from '__int128' to 'long long' changes value from 123456789012345678901234567890 to -4362896299872285998}} -unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-error {{constant is larger than the largest unsigned integer type}} +unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} __uint128_t Unsigned128 = 123456789012345678901234567890Ui128; unsigned long long Unsigned64 = 123456789012345678901234567890Ui128; // expected-warning {{implicit conversion from 'unsigned __int128' to 'unsigned long long' changes value from 123456789012345678901234567890 to 14083847773837265618}} -- 2.7.4