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)