Ping. (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64918#c6 is not addressed in this patch, it's something to be looked at before closing the PR.)
On Fri, Apr 24, 2015 at 12:36:25AM +0200, Marek Polacek wrote: > 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 <pola...@redhat.com> > > 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 Marek