From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 61576 invoked by alias); 23 Apr 2015 22:36:34 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 61511 invoked by uid 89); 23 Apr 2015 22:36:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 23 Apr 2015 22:36:32 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t3NMaTlS031558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 23 Apr 2015 18:36:29 -0400 Received: from redhat.com (ovpn-204-42.brq.redhat.com [10.40.204.42]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t3NMaQAh010127 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Thu, 23 Apr 2015 18:36:28 -0400 Date: Thu, 23 Apr 2015 22:36:00 -0000 From: Marek Polacek To: GCC Patches , Joseph Myers Subject: C PATCH to add -Woverride-init-side-effects (PR c/64918) Message-ID: <20150423223625.GH2813@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-SW-Source: 2015-04/txt/msg01465.txt.bz2 As discussed in the PR, the "initialized field with side-effects overwritten" warning is sometimes not so useful, so it probably makes sense to provide an option so that users are able to specifically enable/disable it. Since the warning is enabled by default at present, it is enabled by default even with this patch, unlike -Woverride-init, which is in -Wextra. Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-04-24 Marek Polacek PR c/64918 * c.opt (Woverride-init-side-effects): New option. * c-typeck.c (add_pending_init): Use OPT_Woverride_init_side_effects. (output_init_element): Likewise. * doc/invoke.texi: Document -Woverride-init-side-effects. * gcc.dg/Woverride-init-side-effects-1.c: New test. * gcc.dg/Woverride-init-side-effects-2.c: New test. diff --git gcc/c-family/c.opt gcc/c-family/c.opt index 983f4a8..50dc8ec 100644 --- gcc/c-family/c.opt +++ gcc/c-family/c.opt @@ -709,6 +709,10 @@ Woverride-init C ObjC Var(warn_override_init) Warning EnabledBy(Wextra) Warn about overriding initializers without side effects +Woverride-init-side-effects +C ObjC Var(warn_override_init_side_effects) Init(1) Warning +Warn about overriding initializers with side effects + Wpacked-bitfield-compat C ObjC C++ ObjC++ Var(warn_packed_bitfield_compat) Init(-1) Warning Warn about packed bit-fields whose offset changed in GCC 4.4 diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c index 91735b5..635b568 100644 --- gcc/c/c-typeck.c +++ gcc/c/c-typeck.c @@ -7978,7 +7978,7 @@ add_pending_init (location_t loc, tree purpose, tree value, tree origtype, if (!implicit) { if (TREE_SIDE_EFFECTS (p->value)) - warning_init (loc, 0, + warning_init (loc, OPT_Woverride_init_side_effects, "initialized field with side-effects " "overwritten"); else if (warn_override_init) @@ -8008,7 +8008,7 @@ add_pending_init (location_t loc, tree purpose, tree value, tree origtype, if (!implicit) { if (TREE_SIDE_EFFECTS (p->value)) - warning_init (loc, 0, + warning_init (loc, OPT_Woverride_init_side_effects, "initialized field with side-effects " "overwritten"); else if (warn_override_init) @@ -8540,7 +8540,7 @@ output_init_element (location_t loc, tree value, tree origtype, if (!implicit) { if (TREE_SIDE_EFFECTS (constructor_elements->last ().value)) - warning_init (loc, 0, + warning_init (loc, OPT_Woverride_init_side_effects, "initialized field with side-effects overwritten"); else if (warn_override_init) warning_init (loc, OPT_Woverride_init, diff --git gcc/doc/invoke.texi gcc/doc/invoke.texi index a939ff7..ff2ff24 100644 --- gcc/doc/invoke.texi +++ gcc/doc/invoke.texi @@ -266,6 +266,7 @@ Objective-C and Objective-C++ Dialects}. -Wmissing-field-initializers -Wmissing-include-dirs @gol -Wno-multichar -Wnonnull -Wnormalized=@r{[}none@r{|}id@r{|}nfc@r{|}nfkc@r{]} @gol -Wodr -Wno-overflow -Wopenmp-simd @gol +-Woverride-init-side-effects @gol -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol -Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol -Wpointer-arith -Wno-pointer-to-int-cast @gol @@ -5177,6 +5178,13 @@ This warning is included in @option{-Wextra}. To get other @option{-Wextra} warnings without this one, use @option{-Wextra -Wno-override-init}. +@item -Woverride-init-side-effects @r{(C and Objective-C only)} +@opindex Woverride-init-side-effects +@opindex Wno-override-init-side-effects +Warn if an initialized field with side effects is overridden when +using designated initializers (@pxref{Designated Inits, , Designated +Initializers}). This warning is enabled by default. + @item -Wpacked @opindex Wpacked @opindex Wno-packed diff --git gcc/testsuite/gcc.dg/Woverride-init-side-effects-1.c gcc/testsuite/gcc.dg/Woverride-init-side-effects-1.c index e69de29..50f198d 100644 --- gcc/testsuite/gcc.dg/Woverride-init-side-effects-1.c +++ gcc/testsuite/gcc.dg/Woverride-init-side-effects-1.c @@ -0,0 +1,25 @@ +/* PR c/64918 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +struct S { int m, n; }; +union U { short s; long int l; }; + +void +foo (int i) +{ + int a[] = { + [0] = ++i, + [1] = i, + [0] = 42 /* { dg-warning "initialized field with side-effects overwritten" } */ + }; + struct S s = { + .n = ++i, + .m = i, + .n = i /* { dg-warning "initialized field with side-effects overwritten" } */ + }; + union U u = { + .s = i--, + .l = 42 /* { dg-warning "initialized field with side-effects overwritten" } */ + }; +} diff --git gcc/testsuite/gcc.dg/Woverride-init-side-effects-2.c gcc/testsuite/gcc.dg/Woverride-init-side-effects-2.c index e69de29..a64e96a 100644 --- gcc/testsuite/gcc.dg/Woverride-init-side-effects-2.c +++ gcc/testsuite/gcc.dg/Woverride-init-side-effects-2.c @@ -0,0 +1,25 @@ +/* PR c/64918 */ +/* { dg-do compile } */ +/* { dg-options "-Wno-override-init-side-effects" } */ + +struct S { int m, n; }; +union U { short s; long int l; }; + +void +foo (int i) +{ + int a[] = { + [0] = ++i, + [1] = i, + [0] = 42 + }; + struct S s = { + .n = ++i, + .m = i, + .n = i + }; + union U u = { + .s = i--, + .l = 42 + }; +} Marek