Hi!

The SIZEOF_EXPR delayed folding caused another problem as the following
testcase shows for -std=c++98.  Fixed by always performing
maybe_constant_init, even for C++98.  Bootstrapped/regtested on x86_64-linux
and i686-linux, ok for trunk?
2012-10-26  Jakub Jelinek  <ja...@redhat.com>

        PR c++/55081
        * typeck2.c (store_init_value): Call fold_non_dependent_expr
        and maybe_constant_init even for C++98.

        * g++.dg/opt/pr55081.C: New test.

--- gcc/cp/typeck2.c.jj 2012-09-25 11:59:43.000000000 +0200
+++ gcc/cp/typeck2.c    2012-10-26 17:46:22.935974382 +0200
@@ -709,11 +709,9 @@ store_init_value (tree decl, tree init,
 
   /* In C++0x constant expression is a semantic, not syntactic, property.
      In C++98, make sure that what we thought was a constant expression at
-     template definition time is still constant.  */
-  if ((cxx_dialect >= cxx0x
-       || DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
-      && (decl_maybe_constant_var_p (decl)
-         || TREE_STATIC (decl)))
+     template definition time is still constant and otherwise perform this
+     as optimization, e.g. to fold SIZEOF_EXPRs in the initializer.  */
+  if (decl_maybe_constant_var_p (decl) || TREE_STATIC (decl))
     {
       bool const_init;
       value = fold_non_dependent_expr (value);
--- gcc/testsuite/g++.dg/opt/pr55081.C.jj       2012-10-26 17:44:03.869797146 
+0200
+++ gcc/testsuite/g++.dg/opt/pr55081.C  2012-10-26 17:42:41.000000000 +0200
@@ -0,0 +1,17 @@
+// PR c++/55081
+// { dg-do compile }
+
+struct R { int field; } r;
+
+__UINTPTR_TYPE__ *
+foo ()
+{
+  static __UINTPTR_TYPE__ array[] = {
+    sizeof (char),
+    (reinterpret_cast <__UINTPTR_TYPE__>(&r.field)
+     - reinterpret_cast <__UINTPTR_TYPE__>(&r)) + 1
+  };
+  return array;
+}
+
+// { dg-final { scan-assembler-not "_ZGVZ3foovE5array" } }

        Jakub

Reply via email to