Index: include/clang/Basic/DiagnosticCommonKinds.td
===================================================================
--- include/clang/Basic/DiagnosticCommonKinds.td	(revision 213657)
+++ include/clang/Basic/DiagnosticCommonKinds.td	(working copy)
@@ -103,10 +103,11 @@
   "'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">;
+  "integer constant evaluates to value %0 that cannot be represented as a "
+  "%1-bit %select{signed|unsigned}2 integer">;
 def ext_integer_too_large_for_signed : ExtWarn<
-  "integer constant is larger than the largest %0-bit signed integer type">,
-  InGroup<DiagGroup<"implicitly-unsigned-literal">>;
+  "integer constant evaluates to value %0 that cannot be represented as a "
+  "%1-bit signed integer">, InGroup<DiagGroup<"implicitly-unsigned-literal">>;
 
 // Sema && AST
 def note_invalid_subexpr_in_const_expr : Note<
Index: include/clang/Lex/LiteralSupport.h
===================================================================
--- include/clang/Lex/LiteralSupport.h	(revision 213645)
+++ include/clang/Lex/LiteralSupport.h	(working copy)
@@ -84,6 +84,11 @@
     return SuffixBegin - ThisTokBegin;
   }
 
+  StringRef getLiteralWithoutSuffix() const {
+    size_t n = std::min(SuffixBegin - ThisTokBegin, ThisTokEnd - ThisTokBegin);
+    return StringRef(ThisTokBegin, n);
+  }
+
   static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix);
 
   unsigned getRadix() const { return radix; }
Index: lib/Lex/PPExpressions.cpp
===================================================================
--- lib/Lex/PPExpressions.cpp	(revision 213657)
+++ lib/Lex/PPExpressions.cpp	(working copy)
@@ -246,7 +246,8 @@
       // Overflow parsing integer literal.
       if (ValueLive)
         PP.Diag(PeekTok, diag::err_integer_too_large)
-            << Result.Val.getBitWidth();
+            << Literal.getLiteralWithoutSuffix() << Result.Val.getBitWidth()
+            << /* Unsigned */ 1;
       Result.Val.setIsUnsigned(true);
     } else {
       // Set the signedness of the result to match whether there was a U suffix
@@ -262,7 +263,7 @@
         // 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();
+              << Literal.getLiteralWithoutSuffix() << Result.Val.getBitWidth();
         Result.Val.setIsUnsigned(true);
       }
     }
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp	(revision 213658)
+++ lib/Sema/SemaDeclAttr.cpp	(working copy)
@@ -194,7 +194,8 @@
   }
 
   if (!I.isIntN(32)) {
-    S.Diag(Expr->getExprLoc(), diag::err_integer_too_large) << 32;
+    S.Diag(Expr->getExprLoc(), diag::err_integer_too_large)
+        << I.toString(10, false) << 32 << /* Unsigned */ 1;
     return false;
   }
 
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp	(revision 213657)
+++ lib/Sema/SemaExpr.cpp	(working copy)
@@ -3118,7 +3118,8 @@
         llvm::APInt ResultVal(Context.getTargetInfo().getLongLongWidth(), 0);
         if (Literal.GetIntegerValue(ResultVal))
           Diag(Tok.getLocation(), diag::err_integer_too_large)
-            << ResultVal.getBitWidth();
+              << Literal.getLiteralWithoutSuffix() << ResultVal.getBitWidth()
+              << /* Unsigned */ 1;
         Lit = IntegerLiteral::Create(Context, ResultVal, CookedTy,
                                      Tok.getLocation());
       }
@@ -3212,7 +3213,8 @@
     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();
+          << Literal.getLiteralWithoutSuffix() << ResultVal.getBitWidth()
+          << /* Unsigned */ 1;
       Ty = Context.UnsignedLongLongTy;
       assert(Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
              "long long is not intmax_t?");
@@ -3293,7 +3295,7 @@
       // 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();
+            << Literal.getLiteralWithoutSuffix() << ResultVal.getBitWidth();
         Ty = Context.UnsignedLongLongTy;
         Width = Context.getTargetInfo().getLongLongWidth();
       }
Index: test/CXX/lex/lex.literal/lex.ext/p3.cpp
===================================================================
--- test/CXX/lex/lex.literal/lex.ext/p3.cpp	(revision 213657)
+++ test/CXX/lex/lex.literal/lex.ext/p3.cpp	(working copy)
@@ -9,7 +9,7 @@
 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 constant evaluates to value 90000000000000000000000000000000000000000000000 that cannot be represented as a 64-bit unsigned integer}}
 
 double &operator "" _x2 (const char *);
 double &i5 = 123123123123123123123123123123123123123123123_x2;
Index: test/Lexer/constants.c
===================================================================
--- test/Lexer/constants.c	(revision 213657)
+++ test/Lexer/constants.c	(working copy)
@@ -15,9 +15,9 @@
 #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 constant evaluates to value 9223372036854775808 that cannot be represented as a 64-bit signed integer}}
 #endif
-#if 0x10000000000000000 // expected-error {{integer constant is larger than the largest 64-bit unsigned integer type}}
+#if 0x10000000000000000 // expected-error {{integer constant evaluates to value 0x10000000000000000 that cannot be represented as a 64-bit unsigned integer}}
 #endif
 
 int c[] = {
Index: test/Sema/128bitint.c
===================================================================
--- test/Sema/128bitint.c	(revision 213657)
+++ test/Sema/128bitint.c	(working copy)
@@ -16,10 +16,10 @@
 __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 constant evaluates to value 123456789012345678901234567890 that cannot be represented as a 64-bit unsigned integer}}
 __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 constant evaluates to value 123456789012345678901234567890 that cannot be represented as a 64-bit unsigned integer}}
 __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}}
 
Index: test/Sema/constructor-attribute.c
===================================================================
--- test/Sema/constructor-attribute.c	(revision 213658)
+++ test/Sema/constructor-attribute.c	(working copy)
@@ -5,7 +5,7 @@
 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 evaluates to value 4294967296 that cannot be represented as a 32-bit unsigned integer}}
 
 int x __attribute__((destructor)); // expected-warning {{'destructor' attribute only applies to functions}}
 int f() __attribute__((destructor));
