Ping:
  https://gcc.gnu.org/ml/gcc-patches/2019-02/msg00363.html

On Wed, 2019-02-06 at 21:23 -0500, David Malcolm wrote:
> PR c++/88680 reports excess warnings from -Wtype-limits after the C++
> FE's use of location wrappers was extended in r267272 for cases such
> as:
> 
>   const unsigned n = 8;
>   static_assert (n >= 0 && n % 2 == 0, "");
> 
> t.C:3:18: warning: comparison of unsigned expression >= 0 is always
> true
>   [-Wtype-limits]
>     3 | static_assert (n >= 0 && n % 2 == 0, "");
>       |                ~~^~~~
> 
> The root cause is that the location wrapper around "n" breaks the
> suppression of the warning for the "if OP0 is a constant that is >=
> 0"
> case.
> 
> This patch fixes it by calling fold_for_warn on OP0, extracting the
> constant.
> 
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
> 
> OK for trunk?
> 
> gcc/c-family/ChangeLog:
>       PR c++/88680
>       * c-common.c (shorten_compare): Call fold_for_warn on op0 when
>       implementing -Wtype-limits.
> 
> gcc/testsuite/ChangeLog:
>       PR c++/88680
>       * g++.dg/wrappers/pr88680.C: New test.
> ---
>  gcc/c-family/c-common.c                 |  2 +-
>  gcc/testsuite/g++.dg/wrappers/pr88680.C | 47
> +++++++++++++++++++++++++++++++++
>  2 files changed, 48 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/wrappers/pr88680.C
> 
> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
> index d3b5879..5813e0a 100644
> --- a/gcc/c-family/c-common.c
> +++ b/gcc/c-family/c-common.c
> @@ -3114,7 +3114,7 @@ shorten_compare (location_t loc, tree *op0_ptr,
> tree *op1_ptr,
>        /* Here we must do the comparison on the nominal type
>        using the args exactly as we received them.  */
>        type = *restype_ptr;
> -      primop0 = op0;
> +      primop0 = fold_for_warn (op0);
>        primop1 = op1;
>  
>        if (!real1 && !real2 && integer_zerop (primop1)
> diff --git a/gcc/testsuite/g++.dg/wrappers/pr88680.C
> b/gcc/testsuite/g++.dg/wrappers/pr88680.C
> new file mode 100644
> index 0000000..86945db
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/wrappers/pr88680.C
> @@ -0,0 +1,47 @@
> +// { dg-do compile { target c++11 } }
> +// { dg-options "-Wtype-limits" }
> +
> +const unsigned N = 8;
> +const unsigned P = 0;
> +
> +enum { FOO, BAR };
> +
> +static_assert (N >= 0 && N % 2 == 0, "");
> +static_assert (FOO >= 0, "");
> +static_assert (FOO >= FOO, "");
> +static_assert (FOO >= P, "");
> +static_assert (BAR >= P, "");
> +static_assert (N >= FOO, "");
> +
> +void test(unsigned n)
> +{
> +  if (N >= 0 && N % 2 == 0, "")
> +    return;
> +  if (FOO >= 0, "")
> +    return;
> +  if (FOO >= FOO, "")
> +    return;
> +  if (FOO >= P, "")
> +    return;
> +  if (BAR >= P)
> +    return;
> +  if (N >= FOO, "")
> +    return;
> +  if (n >= 0) // { dg-warning ">= 0 is always true" }
> +    return;
> +  if (n < 0) // { dg-warning "< 0 is always false" }
> +    return;
> +  if (n >= FOO)
> +    return;
> +  if (n < FOO)
> +    return;
> +  if (N >= 0)
> +    return;
> +  if (N < 0)
> +    return;
> +  if (N >= FOO)
> +    return;
> +  if (N < FOO)
> +    return;
> +
> +}

Reply via email to