Thanks for the patch. On Mon, Jun 17, 2019 at 01:26:37PM -0400, Matthew Beliveau wrote: > --- gcc/c-family/c.opt > +++ gcc/c-family/c.opt > @@ -819,6 +819,10 @@ Wswitch-bool > C ObjC C++ ObjC++ Var(warn_switch_bool) Warning Init(1) > Warn about switches with boolean controlling expression. > > +Wswitch-outside-range > +C++ ObjC++ Var(warn_switch_outside_range) Warning Init(1)
This warning is not C++- specific; it also applies to C and Obj-C. > +Warn about switch values that are outside of their type's range. This is slightly imprecise -- the values are outside of the type of the controlling expression of the switch. So I'd say "that are outside of the switch's type range" or so. > diff --git gcc/doc/invoke.texi gcc/doc/invoke.texi > index bf9da0f0a6e..c23496b2668 100644 > --- gcc/doc/invoke.texi > +++ gcc/doc/invoke.texi > @@ -5390,6 +5390,12 @@ 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 it's "its" > +respective type range. > + This should also say "This warning is enabled by default for C and C++ programs." > diff --git gcc/testsuite/g++.dg/warn/Wswitch-outside-range-1.C > gcc/testsuite/g++.dg/warn/Wswitch-outside-range-1.C > new file mode 100644 > index 00000000000..29e56f3ba2d > --- /dev/null > +++ gcc/testsuite/g++.dg/warn/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/g++.dg/warn/Wswitch-outside-range-2.C > gcc/testsuite/g++.dg/warn/Wswitch-outside-range-2.C > new file mode 100644 > index 00000000000..20cc019b209 > --- /dev/null > +++ gcc/testsuite/g++.dg/warn/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/g++.dg/warn/Wswitch-outside-range-3.C > gcc/testsuite/g++.dg/warn/Wswitch-outside-range-3.C > new file mode 100644 > index 00000000000..baf15561af0 > --- /dev/null > +++ gcc/testsuite/g++.dg/warn/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/g++.dg/warn/Wswitch-outside-range-4.C > gcc/testsuite/g++.dg/warn/Wswitch-outside-range-4.C > new file mode 100644 > index 00000000000..d9bd756dc50 > --- /dev/null > +++ gcc/testsuite/g++.dg/warn/Wswitch-outside-range-4.C > @@ -0,0 +1,9 @@ > +// PR c++/90875 > +// { dg-options "-Wno-pedantic -Wno-switch-outside-range" } (You can also use __extension__ so that you don't need -Wno-pedantic.) > +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" } > +} The tests belong to c-c++-common/ because we want to test both the C and C++ compilers. Please also fix the formatting as Jakub suggested. Thanks, -- Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA