On Thu, Jun 20, 2019 at 09:33:18AM -0400, Matthew Beliveau wrote: > Sorry for the last update, I guess I didn't notice the other changes, oops! > > This should have all the changes. Let me know if anything went wrong! > > Thanks, > Matthew Beliveau > > On Tue, Jun 18, 2019 at 1:38 PM Marek Polacek <pola...@redhat.com> wrote: > > > > On Tue, Jun 18, 2019 at 01:17:10PM -0400, Matthew Beliveau wrote: > > > Hello, > > > > > > This patch should change the formatting, and move the test files into > > > the appropriate directory! > > > > It doesn't address my other comments, though, so please send a new version > > with that fixed. > > > > Marek
> Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2019-06-20 Matthew Beliveau <mbeli...@redhat.com> > > PR c++/90875 - added -Wswitch-outside-range option > * doc/invoke.texi (Wswitch-outside-range): Document. > > * c-warn.c (c_do_switch_warnings): Implemented new Wswitch-outside-range > warning option. > > * c.opt (Wswitch-outside-range): Added new option. > > * c-c++-common/Wswitch-outside-range-1.C: New test. > * c-c++-common/Wswitch-outside-range-2.C: New test. > * c-c++-common/Wswitch-outside-range-3.C: New test. > * c-c++-common/Wswitch-outside-range-4.C: New test. > > diff --git gcc/c-family/c-warn.c gcc/c-family/c-warn.c > index 5941c10cddb..743099c75ca 100644 > --- gcc/c-family/c-warn.c > +++ gcc/c-family/c-warn.c > @@ -1460,8 +1460,9 @@ c_do_switch_warnings (splay_tree cases, location_t > switch_location, > min_value) >= 0) > { > location_t loc = EXPR_LOCATION ((tree) node->value); > - warning_at (loc, 0, "lower value in case label range" > - " less than minimum value for type"); > + warning_at (loc, OPT_Wswitch_outside_range, > + "lower value in case label range less than minimum value" > + " for type"); > CASE_LOW ((tree) node->value) = convert (TREE_TYPE (cond), > min_value); > node->key = (splay_tree_key) CASE_LOW ((tree) node->value); > @@ -1474,8 +1475,8 @@ c_do_switch_warnings (splay_tree cases, location_t > switch_location, > if (node == NULL || !node->key) > break; > location_t loc = EXPR_LOCATION ((tree) node->value); > - warning_at (loc, 0, "case label value is less than minimum " > - "value for type"); > + warning_at (loc, OPT_Wswitch_outside_range, "case label value is" > + " less than minimum value for type"); > splay_tree_remove (cases, node->key); > } > while (1); > @@ -1491,8 +1492,8 @@ c_do_switch_warnings (splay_tree cases, location_t > switch_location, > max_value) > 0) > { > location_t loc = EXPR_LOCATION ((tree) node->value); > - warning_at (loc, 0, "upper value in case label range" > - " exceeds maximum value for type"); > + warning_at (loc, OPT_Wswitch_outside_range, "upper value in case" > + " label range exceeds maximum value for type"); > CASE_HIGH ((tree) node->value) > = convert (TREE_TYPE (cond), max_value); > outside_range_p = true; The formatting is still wrong here... > @@ -1503,7 +1504,7 @@ c_do_switch_warnings (splay_tree cases, location_t > switch_location, > != NULL) > { > location_t loc = EXPR_LOCATION ((tree) node->value); > - warning_at (loc, 0, > + warning_at (loc, OPT_Wswitch_outside_range, > "case label value exceeds maximum value for type"); > splay_tree_remove (cases, node->key); > outside_range_p = true; ...but is correct here. So make the other cases above like this one. > diff --git gcc/doc/invoke.texi gcc/doc/invoke.texi > index eaef4cd63d2..210535cb84a 100644 > --- gcc/doc/invoke.texi > +++ gcc/doc/invoke.texi > @@ -5390,6 +5390,13 @@ switch ((int) (a == 4)) > @end smallexample > This warning is enabled by default for C and C++ programs. > > +@item -Wswitch-outside-range > +@opindex Wswitch-outside-range > +@opindex Wno-switch-outside-range > +Warn whenever a @code{switch} state has a value that is outside of its s/state/case/ > +respective type range. This warning is enabled by default for > +C and C++ progarams. "programs" > diff --git gcc/testsuite/c-c++-common/Wswitch-outside-range-1.C > gcc/testsuite/c-c++-common/Wswitch-outside-range-1.C > new file mode 100644 > index 00000000000..29e56f3ba2d > --- /dev/null > +++ gcc/testsuite/c-c++-common/Wswitch-outside-range-1.C > @@ -0,0 +1,8 @@ > +// PR c++/90875 > + > +void f(char c) > +{ > + switch (c) > + case 300: // { dg-warning "case label value exceeds maximum value for > type" } > + case -300:; // { dg-warning "case label value is less than minimum value > for type" } > +} > diff --git gcc/testsuite/c-c++-common/Wswitch-outside-range-2.C > gcc/testsuite/c-c++-common/Wswitch-outside-range-2.C > new file mode 100644 > index 00000000000..20cc019b209 > --- /dev/null > +++ gcc/testsuite/c-c++-common/Wswitch-outside-range-2.C > @@ -0,0 +1,9 @@ > +// PR c++/90875 > +// { dg-options -Wno-switch-outside-range } > + > +void f(char c) > +{ > + switch (c) > + case 300: //{ dg-bogus "case label value is less than minimum value for > type" } > + case -300:; // { dg-bogus "case label value is less than minimum value > for type" } > +} > diff --git gcc/testsuite/c-c++-common/Wswitch-outside-range-3.C > gcc/testsuite/c-c++-common/Wswitch-outside-range-3.C > new file mode 100644 > index 00000000000..baf15561af0 > --- /dev/null > +++ gcc/testsuite/c-c++-common/Wswitch-outside-range-3.C > @@ -0,0 +1,9 @@ > +// PR c++/90875 > +// { dg-options -Wno-pedantic } > + > +void f(char c) > +{ > + switch (c) > + > + case -300 ... 300:; // { dg-warning "lower value in case label range > less than minimum value for type|upper value in case label range exceeds > maximum value for type" } > +} > diff --git gcc/testsuite/c-c++-common/Wswitch-outside-range-4.C > gcc/testsuite/c-c++-common/Wswitch-outside-range-4.C > new file mode 100644 > index 00000000000..d9bd756dc50 > --- /dev/null > +++ gcc/testsuite/c-c++-common/Wswitch-outside-range-4.C > @@ -0,0 +1,9 @@ > +// PR c++/90875 > +// { dg-options "-Wno-pedantic -Wno-switch-outside-range" } > + > +void f(char c) > +{ > + switch (c) > + > + case -300 ... 300:; // { dg-bogus "lower value in case label range less > than minimum value for type|upper value in case label range exceeds maximum > value for type" } > +} In c-c++-common/, the tests have to have file name suffix ".c", otherwise they will be disregarded; testsuite/g++.dg/dg.exp has # C/C++ common tests. g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/*.\[cSi\]]] \ "" "" Marek