From patchwork Sun Oct 23 11:23:11 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 121224 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id DE5D2B6FAF for ; Sun, 23 Oct 2011 22:25:18 +1100 (EST) Received: (qmail 4730 invoked by alias); 23 Oct 2011 11:25:15 -0000 Received: (qmail 4716 invoked by uid 22791); 23 Oct 2011 11:25:13 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, TW_CX, TW_NV, TW_XF X-Spam-Check-By: sourceware.org Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com) (141.146.126.227) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 23 Oct 2011 11:24:55 +0000 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id p9NBOqDg030143 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 23 Oct 2011 11:24:53 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id p9NBOpPq012582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 23 Oct 2011 11:24:51 GMT Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id p9NBOjiE026885; Sun, 23 Oct 2011 06:24:46 -0500 Received: from [192.168.1.4] (/79.53.13.126) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 23 Oct 2011 04:24:45 -0700 Message-ID: <4EA3F91F.7030703@oracle.com> Date: Sun, 23 Oct 2011 13:23:11 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: Jason Merrill Subject: [C++ Patch] PR 50810 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, this is essentially about enabling -Wnarrowing as part of -Wc++0x-compat (see audit trail for details). Tested x86_64-linux. Ok for mainline? Thanks, Paolo. ///////////////////// /c-family 2011-10-23 Paolo Carlini PR c++/50810 * c-opts.c (c_common_handle_option): Enable -Wnarrowing as part of -Wall; include -Wnarrowing in -Wc++0x-compat; adjust default Wnarrowing for C++0x and C++98. * c.opt ([Wnarrowing]): Adjust. /cp 2011-10-23 Paolo Carlini PR c++/50810 * typeck2.c (check_narrowing): Adjust OPT_Wnarrowing diagnostics. (digest_init_r): Call check_narrowing irrespective of the C++ dialect. * decl.c (check_initializer): Likewise. * semantics.c (finish_compound_literal): Likewise. /testsuite 2011-10-23 Paolo Carlini PR c++/50810 * g++.dg/cpp0x/warn_cxx0x.C: Rename to... * g++.dg/cpp0x/warn_cxx0x1.C: ... this. * g++.dg/cpp0x/warn_cxx0x2.C: New. * g++.dg/cpp0x/warn_cxx0x3.C: Likewise. 2011-10-23 Paolo Carlini PR c++/50810 * doc/invoke.texi ([-Wnarrowing], [-Wc++0x-compat]): Update. Index: doc/invoke.texi =================================================================== --- doc/invoke.texi (revision 180333) +++ doc/invoke.texi (working copy) @@ -2365,17 +2365,16 @@ an instance of a derived class through a pointer t base class does not have a virtual destructor. This warning is enabled by @option{-Wall}. -@item -Wno-narrowing @r{(C++ and Objective-C++ only)} +@item -Wnarrowing @r{(C++ and Objective-C++ only)} @opindex Wnarrowing @opindex Wno-narrowing -With -std=c++0x, suppress the diagnostic required by the standard for -narrowing conversions within @samp{@{ @}}, e.g. +Warn when a narrowing conversion occurs within @samp{@{ @}}, e.g. @smallexample int i = @{ 2.2 @}; // error: narrowing from double to int @end smallexample -This flag can be useful for compiling valid C++98 code in C++0x mode. +This flag is included in @option{-Wall} and @option{-Wc++0x-compat}. @item -Wnoexcept @r{(C++ and Objective-C++ only)} @opindex Wnoexcept @@ -4066,7 +4065,8 @@ ISO C and ISO C++, e.g.@: request for implicit con @item -Wc++0x-compat @r{(C++ and Objective-C++ only)} Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 200x, e.g., identifiers in ISO C++ 1998 that will become keywords -in ISO C++ 200x. This warning is enabled by @option{-Wall}. +in ISO C++ 200x. This warning turns on @option{-Wnarrowing} and is +enabled by @option{-Wall}. @item -Wcast-qual @opindex Wcast-qual Index: c-family/c.opt =================================================================== --- c-family/c.opt (revision 180333) +++ c-family/c.opt (working copy) @@ -490,8 +490,8 @@ C ObjC C++ ObjC++ Warning Warn about use of multi-character character constants Wnarrowing -C ObjC C++ ObjC++ Warning Var(warn_narrowing) Init(1) --Wno-narrowing In C++0x mode, ignore ill-formed narrowing conversions within { } +C ObjC C++ ObjC++ Warning Var(warn_narrowing) Init(-1) Warning +Warn about ill-formed narrowing conversions within { } Wnested-externs C ObjC Var(warn_nested_externs) Warning Index: c-family/c-opts.c =================================================================== --- c-family/c-opts.c (revision 180333) +++ c-family/c-opts.c (working copy) @@ -406,6 +406,7 @@ c_common_handle_option (size_t scode, const char * warn_reorder = value; warn_cxx0x_compat = value; warn_delnonvdtor = value; + warn_narrowing = value; } cpp_opts->warn_trigraphs = value; @@ -436,6 +437,10 @@ c_common_handle_option (size_t scode, const char * cpp_opts->warn_cxx_operator_names = value; break; + case OPT_Wc__0x_compat: + warn_narrowing = value; + break; + case OPT_Wdeprecated: cpp_opts->cpp_warn_deprecated = value; break; @@ -997,11 +1002,18 @@ c_common_post_options (const char **pfilename) if (warn_implicit_function_declaration == -1) warn_implicit_function_declaration = flag_isoc99; - /* If we're allowing C++0x constructs, don't warn about C++0x - compatibility problems. */ if (cxx_dialect == cxx0x) - warn_cxx0x_compat = 0; + { + /* If we're allowing C++0x constructs, don't warn about C++98 + identifiers which are keywords in C++0x. */ + warn_cxx0x_compat = 0; + if (warn_narrowing == -1) + warn_narrowing = 1; + } + else if (warn_narrowing == -1) + warn_narrowing = 0; + if (flag_preprocess_only) { /* Open the output now. We must do so even if flag_no_output is Index: testsuite/g++.dg/cpp0x/warn_cxx0x2.C =================================================================== --- testsuite/g++.dg/cpp0x/warn_cxx0x2.C (revision 0) +++ testsuite/g++.dg/cpp0x/warn_cxx0x2.C (revision 0) @@ -0,0 +1,4 @@ +// PR c++/50810 +// { dg-options "-std=gnu++98 -Wc++0x-compat" } + +signed char data[] = { 0xff }; // { dg-warning "narrowing" } Index: testsuite/g++.dg/cpp0x/warn_cxx0x3.C =================================================================== --- testsuite/g++.dg/cpp0x/warn_cxx0x3.C (revision 0) +++ testsuite/g++.dg/cpp0x/warn_cxx0x3.C (revision 0) @@ -0,0 +1,4 @@ +// PR c++/50810 +// { dg-options "-std=gnu++98 -Wc++0x-compat -Wno-narrowing" } + +signed char data[] = { 0xff }; Index: testsuite/g++.dg/cpp0x/warn_cxx0x.C =================================================================== --- testsuite/g++.dg/cpp0x/warn_cxx0x.C (revision 180333) +++ testsuite/g++.dg/cpp0x/warn_cxx0x.C (working copy) @@ -1,9 +0,0 @@ -// { dg-options "-std=gnu++98 -Wc++0x-compat" } -int static_assert; // { dg-warning "will become a keyword" } -int nullptr; // { dg-warning "will become a keyword" } - -void foo() -{ - static_assert = 5; - nullptr = 5; -} Index: cp/decl.c =================================================================== --- cp/decl.c (revision 180333) +++ cp/decl.c (working copy) @@ -5523,7 +5523,7 @@ check_initializer (tree decl, tree init, int flags else { init = reshape_init (type, init, tf_warning_or_error); - if (cxx_dialect >= cxx0x && SCALAR_TYPE_P (type)) + if (SCALAR_TYPE_P (type)) check_narrowing (type, init); } } Index: cp/typeck2.c =================================================================== --- cp/typeck2.c (revision 180333) +++ cp/typeck2.c (working copy) @@ -803,8 +803,10 @@ check_narrowing (tree type, tree init) } if (!ok) - pedwarn (input_location, OPT_Wnarrowing, "narrowing conversion of %qE " - "from %qT to %qT inside { }", init, ftype, type); + emit_diagnostic ((cxx_dialect != cxx98) ? DK_PEDWARN : DK_WARNING, + input_location, OPT_Wnarrowing, + "narrowing conversion of %qE from %qT to %qT inside { }", + init, ftype, type); } /* Process the initializer INIT for a variable of type TYPE, emitting @@ -901,7 +903,7 @@ digest_init_r (tree type, tree init, bool nested, { tree *exp; - if (cxx_dialect != cxx98 && nested) + if (nested) check_narrowing (type, init); init = convert_for_initialization (0, type, init, flags, ICR_INIT, NULL_TREE, 0, Index: cp/semantics.c =================================================================== --- cp/semantics.c (revision 180333) +++ cp/semantics.c (working copy) @@ -2369,7 +2369,7 @@ finish_compound_literal (tree type, tree compound_ && check_array_initializer (NULL_TREE, type, compound_literal)) return error_mark_node; compound_literal = reshape_init (type, compound_literal, complain); - if (cxx_dialect >= cxx0x && SCALAR_TYPE_P (type) + if (SCALAR_TYPE_P (type) && !BRACE_ENCLOSED_INITIALIZER_P (compound_literal)) check_narrowing (type, compound_literal); if (TREE_CODE (type) == ARRAY_TYPE