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