Author: aaronballman Date: Thu Jul 24 09:51:23 2014 New Revision: 213865 URL: http://llvm.org/viewvc/llvm-project?rev=213865&view=rev Log: Improving the "integer constant too large" diagnostics based on post-commit feedback from Richard Smith. Amends r213657.
Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Lex/PPExpressions.cpp cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp cfe/trunk/test/Lexer/constants.c cfe/trunk/test/Sema/128bitint.c cfe/trunk/test/Sema/constructor-attribute.c Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td Thu Jul 24 09:51:23 2014 @@ -102,10 +102,12 @@ def ext_cxx11_longlong : Extension< def warn_cxx98_compat_longlong : Warning< "'long long' is incompatible with C++98">, InGroup<CXX98CompatPedantic>, DefaultIgnore; -def err_integer_too_large : Error< - "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 %0-bit signed integer type">, +def err_integer_literal_too_large : Error< + "integer literal is too large to be represented in any %select{signed |}0" + "integer type">; +def ext_integer_literal_too_large_for_signed : ExtWarn< + "integer literal is too large to be represented in a signed integer type, " + "interpreting as unsigned">, InGroup<DiagGroup<"implicitly-unsigned-literal">>; // Sema && AST Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Jul 24 09:51:23 2014 @@ -84,6 +84,9 @@ def note_ice_conversion_here : Note< def err_ice_ambiguous_conversion : Error< "ambiguous conversion from type %0 to an integral or unscoped " "enumeration type">; +def err_ice_too_large : Error< + "integer constant expression evaluates to value %0 that cannot be " + "represented in a %1-bit %select{signed|unsigned}2 integer type">; // Semantic analysis of constant literals. def ext_predef_outside_function : Warning< Modified: cfe/trunk/lib/Lex/PPExpressions.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPExpressions.cpp?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPExpressions.cpp (original) +++ cfe/trunk/lib/Lex/PPExpressions.cpp Thu Jul 24 09:51:23 2014 @@ -245,8 +245,8 @@ static bool EvaluateValue(PPValue &Resul if (Literal.GetIntegerValue(Result.Val)) { // Overflow parsing integer literal. if (ValueLive) - PP.Diag(PeekTok, diag::err_integer_too_large) - << Result.Val.getBitWidth(); + PP.Diag(PeekTok, diag::err_integer_literal_too_large) + << /* Unsigned */ 1; Result.Val.setIsUnsigned(true); } else { // Set the signedness of the result to match whether there was a U suffix @@ -261,8 +261,7 @@ static bool EvaluateValue(PPValue &Resul // 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) - << Result.Val.getBitWidth(); + PP.Diag(PeekTok, diag::ext_integer_literal_too_large_for_signed); Result.Val.setIsUnsigned(true); } } Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Thu Jul 24 09:51:23 2014 @@ -194,7 +194,8 @@ static bool checkUInt32Argument(Sema &S, } if (!I.isIntN(32)) { - S.Diag(Expr->getExprLoc(), diag::err_integer_too_large) << 32; + S.Diag(Expr->getExprLoc(), diag::err_ice_too_large) + << I.toString(10, false) << 32 << /* Unsigned */ 1; return false; } Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Jul 24 09:51:23 2014 @@ -3117,8 +3117,8 @@ ExprResult Sema::ActOnNumericConstant(co } else { llvm::APInt ResultVal(Context.getTargetInfo().getLongLongWidth(), 0); if (Literal.GetIntegerValue(ResultVal)) - Diag(Tok.getLocation(), diag::err_integer_too_large) - << ResultVal.getBitWidth(); + Diag(Tok.getLocation(), diag::err_integer_literal_too_large) + << /* Unsigned */ 1; Lit = IntegerLiteral::Create(Context, ResultVal, CookedTy, Tok.getLocation()); } @@ -3211,8 +3211,8 @@ ExprResult Sema::ActOnNumericConstant(co 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) - << ResultVal.getBitWidth(); + Diag(Tok.getLocation(), diag::err_integer_literal_too_large) + << /* Unsigned */ 1; Ty = Context.UnsignedLongLongTy; assert(Context.getTypeSize(Ty) == ResultVal.getBitWidth() && "long long is not intmax_t?"); @@ -3292,8 +3292,7 @@ ExprResult Sema::ActOnNumericConstant(co // 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) - << ResultVal.getBitWidth(); + Diag(Tok.getLocation(), diag::ext_integer_literal_too_large_for_signed); Ty = Context.UnsignedLongLongTy; Width = Context.getTargetInfo().getLongLongWidth(); } Modified: cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp (original) +++ cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp Thu Jul 24 09:51:23 2014 @@ -9,7 +9,7 @@ int &i2 = 45_x1; template<char...> char &operator "" _x1 (); int &i3 = 0377_x1; -int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} +int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-error {{integer literal is too large to be represented in any integer type}} double &operator "" _x2 (const char *); double &i5 = 123123123123123123123123123123123123123123123_x2; Modified: cfe/trunk/test/Lexer/constants.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/constants.c?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/test/Lexer/constants.c (original) +++ cfe/trunk/test/Lexer/constants.c Thu Jul 24 09:51:23 2014 @@ -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 64-bit signed integer type}} +#if 9223372036854775808 // expected-warning {{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}} #endif -#if 0x10000000000000000 // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}} +#if 0x10000000000000000 // expected-error {{integer literal is too large to be represented in any integer type}} #endif int c[] = { Modified: cfe/trunk/test/Sema/128bitint.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/128bitint.c?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/test/Sema/128bitint.c (original) +++ cfe/trunk/test/Sema/128bitint.c Thu Jul 24 09:51:23 2014 @@ -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 {{integer constant is larger than the largest 64-bit unsigned integer type}} +long long SignedTooBig = 123456789012345678901234567890; // expected-error {{integer literal is too large to be represented in any 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 {{integer constant is larger than the largest 64-bit unsigned integer type}} +unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-error {{integer literal is too large to be represented in any 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}} Modified: cfe/trunk/test/Sema/constructor-attribute.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/constructor-attribute.c?rev=213865&r1=213864&r2=213865&view=diff ============================================================================== --- cfe/trunk/test/Sema/constructor-attribute.c (original) +++ cfe/trunk/test/Sema/constructor-attribute.c Thu Jul 24 09:51:23 2014 @@ -5,7 +5,7 @@ int f() __attribute__((constructor)); int f() __attribute__((constructor(1))); int f() __attribute__((constructor(1,2))); // expected-error {{'constructor' attribute takes no more than 1 argument}} int f() __attribute__((constructor(1.0))); // expected-error {{'constructor' attribute requires an integer constant}} -int f() __attribute__((constructor(0x100000000))); // expected-error {{integer constant is larger than the largest 32-bit unsigned integer type}} +int f() __attribute__((constructor(0x100000000))); // expected-error {{integer constant expression evaluates to value 4294967296 that cannot be represented in a 32-bit unsigned integer type}} int x __attribute__((destructor)); // expected-warning {{'destructor' attribute only applies to functions}} int f() __attribute__((destructor)); _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits