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

Reply via email to