diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index 09d43f382bb6..0430b1dc27a5 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -104,8 +104,9 @@ def warn_cxx98_compat_longlong : Warning< InGroup, DefaultIgnore; def err_integer_too_large : Error< "integer constant is larger than the largest unsigned integer type">; -def warn_integer_too_large_for_signed : Warning< - "integer constant is larger than the largest signed integer type">; +def ext_integer_too_large_for_signed : ExtWarn< + "integer constant is larger than the largest signed integer type">, + InGroup>; // Sema && AST def note_invalid_subexpr_in_const_expr : Note< diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 183074340f2f..86b0f080fb86 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -151,7 +151,8 @@ def warn_ucn_not_valid_in_c89_literal : ExtWarn< // Literal def ext_nonstandard_escape : Extension< "use of non-standard escape character '\\%0'">; -def ext_unknown_escape : ExtWarn<"unknown escape sequence '\\%0'">; +def ext_unknown_escape : ExtWarn<"unknown escape sequence '\\%0'">, + InGroup>; def err_invalid_decimal_digit : Error<"invalid digit '%0' in decimal constant">; def err_invalid_binary_digit : Error<"invalid digit '%0' in binary constant">; def err_invalid_octal_digit : Error<"invalid digit '%0' in octal constant">; diff --git a/clang/lib/Lex/PPExpressions.cpp b/clang/lib/Lex/PPExpressions.cpp index f7c3be99585c..6975d31baba5 100644 --- a/clang/lib/Lex/PPExpressions.cpp +++ b/clang/lib/Lex/PPExpressions.cpp @@ -258,9 +258,10 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, // large that it is unsigned" e.g. on 12345678901234567890 where intmax_t // is 64-bits. if (!Literal.isUnsigned && Result.Val.isNegative()) { - // Don't warn for a hex or octal literal: 0x8000..0 shouldn't warn. + // 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::warn_integer_too_large_for_signed); + PP.Diag(PeekTok, diag::ext_integer_too_large_for_signed); Result.Val.setIsUnsigned(true); } } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 51daf856d547..72ac597b157f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3210,7 +3210,7 @@ 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::warn_integer_too_large_for_signed); + Diag(Tok.getLocation(), diag::ext_integer_too_large_for_signed); Ty = Context.UnsignedLongLongTy; Width = Context.getTargetInfo().getLongLongWidth(); } diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c index d1653b4c053d..07a7fa503566 100644 --- a/clang/test/Misc/warning-flags.c +++ b/clang/test/Misc/warning-flags.c @@ -18,7 +18,7 @@ This test serves two purposes: The list of warnings below should NEVER grow. It should gradually shrink to 0. -CHECK: Warnings without flags (108): +CHECK: Warnings without flags (106): CHECK-NEXT: ext_delete_void_ptr_operand CHECK-NEXT: ext_expected_semi_decl_list CHECK-NEXT: ext_explicit_specialization_storage_class @@ -35,7 +35,6 @@ CHECK-NEXT: ext_typecheck_cond_incompatible_operands CHECK-NEXT: ext_typecheck_cond_incompatible_operands_nonstandard CHECK-NEXT: ext_typecheck_ordered_comparison_of_function_pointers CHECK-NEXT: ext_typecheck_ordered_comparison_of_pointer_integer -CHECK-NEXT: ext_unknown_escape CHECK-NEXT: ext_using_undefined_std CHECK-NEXT: pp_include_next_absolute_path CHECK-NEXT: pp_include_next_in_primary @@ -83,7 +82,6 @@ CHECK-NEXT: warn_implements_nscopying CHECK-NEXT: warn_incompatible_qualified_id CHECK-NEXT: warn_initializer_string_for_char_array_too_long CHECK-NEXT: warn_inline_namespace_reopened_noninline -CHECK-NEXT: warn_integer_too_large_for_signed CHECK-NEXT: warn_invalid_asm_cast_lvalue CHECK-NEXT: warn_maynot_respond CHECK-NEXT: warn_method_param_redefinition diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html index b29d587a9482..0849bbcdcfb1 100644 --- a/clang/www/cxx_status.html +++ b/clang/www/cxx_status.html @@ -205,8 +205,16 @@ currently requires the C++ runtime library from g++-4.8 or later.

N2341 Clang 3.3 - - + + Conditionally-support behavior + N1627 + Clang 2.9 + + + Changing undefined behavior into diagnosable errors + N1727 + Clang 2.9 + Delegating constructors N1986