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

Reply via email to