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)