On Wed, 11 Jan 2017, Jakub Jelinek wrote:

> On Wed, Jan 11, 2017 at 09:31:38AM +0100, Richard Biener wrote:
> > > 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).
> 
> Ok, I'll bootstrap/regtest following patch then:

LGTM.

Richard.

> 2017-01-11  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR c++/71537
>       * fold-const.c (maybe_nonzero_address): Return 1 for function
>       local objects.
>       (tree_single_nonzero_warnv_p): Don't handle function local objects
>       here.
> 
>       * g++.dg/cpp1y/constexpr-71537.C: New test.
> 
> --- gcc/fold-const.c.jj       2017-01-11 09:36:36.673864630 +0100
> +++ gcc/fold-const.c  2017-01-11 09:44:20.004660940 +0100
> @@ -8171,7 +8171,8 @@ pointer_may_wrap_p (tree base, tree offs
>  /* Return a positive integer when the symbol DECL is known to have
>     a nonzero address, zero when it's known not to (e.g., it's a weak
>     symbol), and a negative integer when the symbol is not yet in the
> -   symbol table and so whether or not its address is zero is unknown.  */
> +   symbol table and so whether or not its address is zero is unknown.
> +   For function local objects always return positive integer.  */
>  static int
>  maybe_nonzero_address (tree decl)
>  {
> @@ -8179,6 +8180,13 @@ maybe_nonzero_address (tree decl)
>      if (struct symtab_node *symbol = symtab_node::get_create (decl))
>        return symbol->nonzero_address ();
>  
> +  /* Function local objects are never NULL.  */
> +  if (DECL_P (decl)
> +      && (DECL_CONTEXT (decl)
> +      && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
> +      && auto_var_in_fn_p (decl, DECL_CONTEXT (decl))))
> +    return 1;
> +
>    return -1;
>  }
>  
> @@ -13276,13 +13284,6 @@ tree_single_nonzero_warnv_p (tree t, boo
>       if (nonzero_addr >= 0)
>         return nonzero_addr;
>  
> -     /* Function local objects are never NULL.  */
> -     if (DECL_P (base)
> -         && (DECL_CONTEXT (base)
> -             && TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
> -             && auto_var_in_fn_p (base, DECL_CONTEXT (base))))
> -       return true;
> -
>       /* Constants are never weak.  */
>       if (CONSTANT_CLASS_P (base))
>         return true;
> --- gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C.jj   2017-01-11 
> 09:41:32.103909019 +0100
> +++ gcc/testsuite/g++.dg/cpp1y/constexpr-71537.C      2017-01-11 
> 09:41:32.103909019 +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