On Mon, Jul 22, 2013 at 5:25 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: efriedma<br>
Date: Mon Jul 22 19:25:18 2013<br>
New Revision: 186903<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=186903&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=186903&view=rev</a><br>
Log:<br>
Integers which are too large should be an error.<br></blockquote><div><br></div><div>The "too_large_for_signed" part of this doesn't look correct. In C89, unsuffixed integers too large to be a long are an unsigned long. In other language standards, the same behavior is a GNU extension.</div>
<div>Â </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Switch some warnings over to errors which should never have been warnings<br>
in the first place. Â (Also, a minor fix to the preprocessor rules for<br>
integer literals while I'm here.)<br>
<br>
Modified:<br>
  cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td<br>
  cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>
  cfe/trunk/lib/Lex/LiteralSupport.cpp<br>
  cfe/trunk/lib/Lex/PPExpressions.cpp<br>
  cfe/trunk/lib/Sema/SemaExpr.cpp<br>
  cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp<br>
  cfe/trunk/test/CodeGen/statements.c<br>
  cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c<br>
  cfe/trunk/test/Lexer/constants.c<br>
  cfe/trunk/test/Misc/warning-flags.c<br>
  cfe/trunk/test/Sema/128bitint.c<br>
  cfe/trunk/test/Sema/alloc_size.c<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td Mon Jul 22 19:25:18 2013<br>
@@ -99,10 +99,10 @@ def ext_cxx11_longlong : Extension<<br>
 def warn_cxx98_compat_longlong : Warning<<br>
  "'long long' is incompatible with C++98">,<br>
  InGroup<CXX98CompatPedantic>, DefaultIgnore;<br>
-def warn_integer_too_large : Warning<<br>
- Â "integer constant is too large for its type">;<br>
-def warn_integer_too_large_for_signed : Warning<<br>
- Â "integer constant is so large that it is unsigned">;<br>
+def err_integer_too_large : Error<<br>
+ Â "integer constant is larger than the largest unsigned integer type">;<br>
+def err_integer_too_large_for_signed : Error<<br>
+ Â "integer constant is larger than the largest signed integer type">;<br>
<br>
 // Sema && AST<br>
 def note_invalid_subexpr_in_const_expr : Note<<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Mon Jul 22 19:25:18 2013<br>
@@ -180,8 +180,8 @@ def warn_cxx11_compat_binary_literal : W<br>
  "binary integer literals are incompatible with C++ standards before C++1y">,<br>
  InGroup<CXXPre1yCompatPedantic>, DefaultIgnore;<br>
 def err_pascal_string_too_long : Error<"Pascal string is too long">;<br>
-def warn_octal_escape_too_large : ExtWarn<"octal escape sequence out of range">;<br>
-def warn_hex_escape_too_large : ExtWarn<"hex escape sequence out of range">;<br>
+def err_octal_escape_too_large : Error<"octal escape sequence out of range">;<br>
+def err_hex_escape_too_large : Error<"hex escape sequence out of range">;<br>
 def ext_string_too_long : Extension<"string literal of length %0 exceeds "<br>
  "maximum length %1 that %select{C90|ISO C99|C++}2 compilers are required to "<br>
  "support">, InGroup<OverlengthStrings>;<br>
<br>
Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)<br>
+++ cfe/trunk/lib/Lex/LiteralSupport.cpp Mon Jul 22 19:25:18 2013<br>
@@ -157,7 +157,7 @@ static unsigned ProcessCharEscape(const<br>
   // Check for overflow.<br>
   if (Overflow && Diags)  // Too many digits to fit in<br>
    Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf,<br>
- Â Â Â Â Â diag::warn_hex_escape_too_large);<br>
+ Â Â Â Â Â diag::err_hex_escape_too_large);<br>
   break;<br>
  }<br>
  case '0': case '1': case '2': case '3':<br>
@@ -180,7 +180,7 @@ static unsigned ProcessCharEscape(const<br>
   if (CharWidth != 32 && (ResultChar >> CharWidth) != 0) {<br>
    if (Diags)<br>
     Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf,<br>
- Â Â Â Â Â Â diag::warn_octal_escape_too_large);<br>
+ Â Â Â Â Â Â diag::err_octal_escape_too_large);<br>
    ResultChar &= ~0U >> (32-CharWidth);<br>
   }<br>
   break;<br>
<br>
Modified: cfe/trunk/lib/Lex/PPExpressions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPExpressions.cpp?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPExpressions.cpp?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Lex/PPExpressions.cpp (original)<br>
+++ cfe/trunk/lib/Lex/PPExpressions.cpp Mon Jul 22 19:25:18 2013<br>
@@ -245,7 +245,7 @@ static bool EvaluateValue(PPValue &Resul<br>
   // Parse the integer literal into Result.<br>
   if (Literal.GetIntegerValue(Result.Val)) {<br>
    // Overflow parsing integer literal.<br>
- Â Â Â if (ValueLive) PP.Diag(PeekTok, diag::warn_integer_too_large);<br>
+ Â Â Â if (ValueLive) PP.Diag(PeekTok, diag::err_integer_too_large);<br>
    Result.Val.setIsUnsigned(true);<br>
   } else {<br>
    // Set the signedness of the result to match whether there was a U suffix<br>
@@ -257,9 +257,9 @@ static bool EvaluateValue(PPValue &Resul<br>
    // large that it is unsigned" e.g. on 12345678901234567890 where intmax_t<br>
    // is 64-bits.<br>
    if (!Literal.isUnsigned && Result.Val.isNegative()) {<br>
- Â Â Â Â // Don't warn for a hex literal: 0x8000..0 shouldn't warn.<br>
- Â Â Â Â if (ValueLive && Literal.getRadix() != 16)<br>
- Â Â Â Â Â PP.Diag(PeekTok, diag::warn_integer_too_large_for_signed);<br>
+ Â Â Â Â // Don't warn for a hex or octal literal: 0x8000..0 shouldn't warn.<br>
+ Â Â Â Â if (ValueLive && Literal.getRadix() == 10)<br>
+ Â Â Â Â Â PP.Diag(PeekTok, diag::err_integer_too_large_for_signed);<br>
     Result.Val.setIsUnsigned(true);<br>
    }<br>
   }<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Jul 22 19:25:18 2013<br>
@@ -2909,7 +2909,7 @@ ExprResult Sema::ActOnNumericConstant(co<br>
    } else {<br>
     llvm::APInt ResultVal(Context.getTargetInfo().getLongLongWidth(), 0);<br>
     if (Literal.GetIntegerValue(ResultVal))<br>
- Â Â Â Â Â Diag(Tok.getLocation(), diag::warn_integer_too_large);<br>
+ Â Â Â Â Â Diag(Tok.getLocation(), diag::err_integer_too_large);<br>
     Lit = IntegerLiteral::Create(Context, ResultVal, CookedTy,<br>
                   Tok.getLocation());<br>
    }<br>
@@ -3002,8 +3002,8 @@ ExprResult Sema::ActOnNumericConstant(co<br>
   llvm::APInt ResultVal(MaxWidth, 0);<br>
<br>
   if (Literal.GetIntegerValue(ResultVal)) {<br>
- Â Â Â // If this value didn't fit into uintmax_t, warn and force to ull.<br>
- Â Â Â Diag(Tok.getLocation(), diag::warn_integer_too_large);<br>
+ Â Â Â // If this value didn't fit into uintmax_t, error and force to ull.<br>
+ Â Â Â Diag(Tok.getLocation(), diag::err_integer_too_large);<br>
    Ty = Context.UnsignedLongLongTy;<br>
    assert(Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&<br>
       "long long is not intmax_t?");<br>
@@ -3079,7 +3079,7 @@ ExprResult Sema::ActOnNumericConstant(co<br>
    // If we still couldn't decide a type, we probably have something that<br>
    // does not fit in a signed long long, but has no U suffix.<br>
    if (Ty.isNull()) {<br>
- Â Â Â Â Diag(Tok.getLocation(), diag::warn_integer_too_large_for_signed);<br>
+ Â Â Â Â Diag(Tok.getLocation(), diag::err_integer_too_large_for_signed);<br>
     Ty = Context.UnsignedLongLongTy;<br>
     Width = Context.getTargetInfo().getLongLongWidth();<br>
    }<br>
<br>
Modified: cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp (original)<br>
+++ cfe/trunk/test/CXX/lex/lex.literal/lex.ext/p3.cpp Mon Jul 22 19:25:18 2013<br>
@@ -9,7 +9,7 @@ int &i2 = 45_x1;<br>
 template<char...> char &operator "" _x1 ();<br>
 int &i3 = 0377_x1;<br>
<br>
-int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-warning {{integer constant is too large}}<br>
+int &i4 = 90000000000000000000000000000000000000000000000_x1; // expected-error {{integer constant is larger than the largest unsigned integer type}}<br>
<br>
 double &operator "" _x2 (const char *);<br>
 double &i5 = 123123123123123123123123123123123123123123123_x2;<br>
<br>
Modified: cfe/trunk/test/CodeGen/statements.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/statements.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/statements.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/statements.c (original)<br>
+++ cfe/trunk/test/CodeGen/statements.c Mon Jul 22 19:25:18 2013<br>
@@ -1,13 +1,6 @@<br>
 // RUN: %clang_cc1 -Wno-error=return-type %s -emit-llvm-only<br>
 // REQUIRES: LP64<br>
<br>
-void test1(int x) {<br>
-switch (x) {<br>
-case 111111111111111111111111111111111111111:<br>
-bar();<br>
-}<br>
-}<br>
-<br>
 // Mismatched type between return and function result.<br>
 int test2() { return; }<br>
 void test3() { return 4; }<br>
<br>
Modified: cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c (original)<br>
+++ cfe/trunk/test/CodeGen/string-literal-unicode-conversion.c Mon Jul 22 19:25:18 2013<br>
@@ -31,10 +31,11 @@ void f() {<br>
  wchar_t const *b = L"Úþшúð";<br>
<br>
  // CHECK-C: private unnamed_addr constant [4 x i32] [i32 20320, i32 22909, i32 66304, i32 0], align 4<br>
- Â // CHECK-SHORTWCHAR: private unnamed_addr constant [4 x i16] [i16 20320, i16 22909, i16 768, i16 0], align 2<br>
  // CHECK-CPP0X: private unnamed_addr constant [4 x i32] [i32 20320, i32 22909, i32 66304, i32 0], align 4<br>
+#if __WCHAR_MAX__ == 2147483647<br>
  wchar_t const *b2 = L"\x4f60\x597d\x10300";<br>
-<br>
+#endif<br>
+<br>
 #if __cplusplus >= 201103L<br>
<br>
  // CHECK-CPP0X: private unnamed_addr constant [12 x i8] c"1\D0\9A\D0\BE\D1\88\D0\BA\D0\B0\00", align 1<br>
<br>
Modified: cfe/trunk/test/Lexer/constants.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/constants.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/constants.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Lexer/constants.c (original)<br>
+++ cfe/trunk/test/Lexer/constants.c Mon Jul 22 19:25:18 2013<br>
@@ -13,7 +13,12 @@ float Y = 08.123456;<br>
 // PR2252<br>
 #if -0x8000000000000000  // should not warn.<br>
 #endif<br>
-<br>
+#if -01000000000000000000000 Â // should not warn.<br>
+#endif<br>
+#if 9223372036854775808 // expected-error {{integer constant is larger than the largest signed integer type}}<br>
+#endif<br>
+#if 0x10000000000000000 // expected-error {{integer constant is larger than the largest unsigned integer type}}<br>
+#endif<br>
<br>
 int c[] = {<br>
  'df',  // expected-warning {{multi-character character constant}}<br>
<br>
Modified: cfe/trunk/test/Misc/warning-flags.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/warning-flags.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/warning-flags.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Misc/warning-flags.c (original)<br>
+++ cfe/trunk/test/Misc/warning-flags.c Mon Jul 22 19:25:18 2013<br>
@@ -18,7 +18,7 @@ This test serves two purposes:<br>
<br>
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.<br>
<br>
-CHECK: Warnings without flags (140):<br>
+CHECK: Warnings without flags (136):<br>
 CHECK-NEXT:  ext_delete_void_ptr_operand<br>
 CHECK-NEXT:  ext_enum_friend<br>
 CHECK-NEXT:  ext_expected_semi_decl_list<br>
@@ -81,14 +81,11 @@ CHECK-NEXT: Â warn_fe_cc_log_diagnostics<br>
 CHECK-NEXT:  warn_fe_cc_print_header_failure<br>
 CHECK-NEXT:  warn_fe_macro_contains_embedded_newline<br>
 CHECK-NEXT:  warn_file_asm_volatile<br>
-CHECK-NEXT: Â warn_hex_escape_too_large<br>
 CHECK-NEXT:  warn_ignoring_ftabstop_value<br>
 CHECK-NEXT:  warn_implements_nscopying<br>
 CHECK-NEXT:  warn_incompatible_qualified_id<br>
 CHECK-NEXT:  warn_initializer_string_for_char_array_too_long<br>
 CHECK-NEXT:  warn_inline_namespace_reopened_noninline<br>
-CHECK-NEXT: Â warn_integer_too_large<br>
-CHECK-NEXT: Â warn_integer_too_large_for_signed<br>
 CHECK-NEXT:  warn_invalid_asm_cast_lvalue<br>
 CHECK-NEXT:  warn_many_braces_around_scalar_init<br>
 CHECK-NEXT:  warn_maynot_respond<br>
@@ -104,7 +101,6 @@ CHECK-NEXT: Â warn_nonnull_pointers_only<br>
 CHECK-NEXT:  warn_not_compound_assign<br>
 CHECK-NEXT:  warn_objc_property_copy_missing_on_block<br>
 CHECK-NEXT:  warn_objc_protocol_qualifier_missing_id<br>
-CHECK-NEXT: Â warn_octal_escape_too_large<br>
 CHECK-NEXT:  warn_on_superclass_use<br>
 CHECK-NEXT:  warn_param_default_argument_redefinition<br>
 CHECK-NEXT:  warn_partial_specs_not_deducible<br>
<br>
Modified: cfe/trunk/test/Sema/128bitint.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/128bitint.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/128bitint.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/128bitint.c (original)<br>
+++ cfe/trunk/test/Sema/128bitint.c Mon Jul 22 19:25:18 2013<br>
@@ -16,10 +16,10 @@ __uint128_t b = (__uint128_t)-1;<br>
 __int128 i = (__int128)0;<br>
 unsigned __int128 u = (unsigned __int128)-1;<br>
<br>
-long long SignedTooBig = 123456789012345678901234567890; // expected-warning {{integer constant is too large for its type}}<br>
+long long SignedTooBig = 123456789012345678901234567890; // expected-error {{constant is larger than the largest unsigned integer type}}<br>
 __int128_t Signed128 = 123456789012345678901234567890i128;<br>
 long long Signed64 = 123456789012345678901234567890i128; // expected-warning {{implicit conversion from '__int128' to 'long long' changes value from 123456789012345678901234567890 to -4362896299872285998}}<br>
-unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-warning {{integer constant is too large for its type}}<br>
+unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-error {{constant is larger than the largest unsigned integer type}}<br>
 __uint128_t Unsigned128 = 123456789012345678901234567890Ui128;<br>
 unsigned long long Unsigned64 = 123456789012345678901234567890Ui128; // expected-warning {{implicit conversion from 'unsigned __int128' to 'unsigned long long' changes value from 123456789012345678901234567890 to 14083847773837265618}}<br>
<br>
<br>
Modified: cfe/trunk/test/Sema/alloc_size.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/alloc_size.c?rev=186903&r1=186902&r2=186903&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/alloc_size.c?rev=186903&r1=186902&r2=186903&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/alloc_size.c (original)<br>
+++ cfe/trunk/test/Sema/alloc_size.c Mon Jul 22 19:25:18 2013<br>
@@ -19,7 +19,7 @@ void* fn7(unsigned) __attribute__((alloc<br>
<br>
 void *fn8(int, int) __attribute__((alloc_size(1, 1))); // OK<br>
<br>
-void* fn9(unsigned) __attribute__((alloc_size(12345678901234567890123))); // expected-warning {{integer constant is too large for its type}} // expected-error {{attribute parameter 1 is out of bounds}}<br>
+void* fn9(unsigned) __attribute__((alloc_size(12345678901234567890123))); // expected-error {{integer constant is larger than the largest unsigned integer type}} // expected-error {{attribute parameter 1 is out of bounds}}<br>
<br>
 void* fn10(size_t, size_t) __attribute__((alloc_size(1,2))); // expected-error{{redefinition of parameter}} \<br>
                               // expected-error{{a parameter list without types is only allowed in a function definition}} \<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br>