On Tue, 10 Jan 2017, Jakub Jelinek wrote:

> Hi!
> 
> This patch allows to fold n + 1 != 0 into true for automatic array n.
> We already handle it for variables in the symbol table (if not weak),
> but automatic vars are never in the symbol table.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> Or shall I add the function local address check into maybe_nonzero_address
> instead (return 1 for those)?

Yes please, and cleanup the other user of maybe_nonzero_address then
(which contains the code you added).

Richar.

> 2017-01-10  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR c++/71537
>       * fold-const.c (fold_comparison): Handle also comparison of
>       addresses of local objects against NULL.
> 
>       * g++.dg/cpp1y/constexpr-71537.C: New test.
> 
> --- gcc/fold-const.c.jj       2017-01-01 12:45:38.000000000 +0100
> +++ gcc/fold-const.c  2017-01-10 12:16:47.005931072 +0100
> @@ -8420,7 +8420,11 @@ fold_comparison (location_t loc, enum tr
>        every object pointer compares greater than a null pointer.
>        */
>        else if (((DECL_P (base0)
> -              && maybe_nonzero_address (base0) > 0
> +              && (maybe_nonzero_address (base0) > 0
> +                  /* Function local objects are never NULL.  */
> +                  || (DECL_CONTEXT (base0)
> +                      && TREE_CODE (DECL_CONTEXT (base0)) == FUNCTION_DECL
> +                      && auto_var_in_fn_p (base0, DECL_CONTEXT (base0))))
>                /* Avoid folding references to struct members at offset 0 to
>                   prevent tests like '&ptr->firstmember == 0' from getting
>                   eliminated.  When ptr is null, although the -> expression
> --- gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C.jj   2017-01-10 
> 12:22:07.102748236 +0100
> +++ gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C      2017-01-10 
> 12:21:41.000000000 +0100
> @@ -0,0 +1,14 @@
> +// PR c++/71537
> +// { dg-do compile { target c++14 } }
> +
> +constexpr bool
> +foo ()
> +{
> +  constexpr int n[42] = { 1 };
> +  constexpr int o = n ? 1 : 0;
> +  constexpr int p = n + 1 ? 1 : 0;
> +  constexpr int q = "abc" + 1 ? 1 : 0;
> +  return p + p + q == 3;
> +}
> +
> +static_assert (foo (), "");
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to