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)? 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