]> granicus.if.org Git - clang/commitdiff
Provide extra information in the "integer constant is too large" diagnostic. This...
authorAaron Ballman <aaron@aaronballman.com>
Tue, 22 Jul 2014 14:08:09 +0000 (14:08 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Tue, 22 Jul 2014 14:08:09 +0000 (14:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213657 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticCommonKinds.td
lib/Lex/PPExpressions.cpp
lib/Sema/SemaExpr.cpp
test/CXX/lex/lex.literal/lex.ext/p3.cpp
test/Lexer/constants.c
test/Sema/128bitint.c

index b3c77b8f5f36582f2afcc48a9f2d84d14f354da8..dc40998c6bff30afc252c1b05d787a66f2a3bbde 100644 (file)
@@ -103,9 +103,9 @@ 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 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<DiagGroup<"implicitly-unsigned-literal">>;
 
 // Sema && AST
index 2260bf98f7a5e4b77aa781ea79057e392f269ac7..672140b4306f307e953c9add87307be3943e4a2a 100644 (file)
@@ -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);
       }
     }
index 35dad82523c9ff8c24223e86515ca19c4fb097fd..3062e4274f94bb584c743175f9717318b5efec7b 100644 (file)
@@ -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();
       }
index e812ddddd8a46238c65b5be7f8886defafa20666..bfbb2326a1e3597db01a9845389bf14b64adfd4a 100644 (file)
@@ -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 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;
index f0cd4d7cf29cf938be9e7ee5f7c2d4aaded1c282..a04d586085e37eb40c06cd62b1d54c03cd1193f0 100644 (file)
@@ -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[] = {
index 4272b2d1391edcf59cdb74feeece3c67b2e4bc6b..f1ec05e81b6b2ba7010bc5d9f583656d3e69b28e 100644 (file)
@@ -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}}