OSDN Git Service

PR c++/31809
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 May 2007 21:24:24 +0000 (21:24 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 May 2007 21:24:24 +0000 (21:24 +0000)
* decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC
variables that need runtime initialization.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125201 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/static5.C [new file with mode: 0644]

index 9dca96a..c3d6b0b 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/31809
+       * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC
+       variables that need runtime initialization.
+
 2007-05-28  Andrew Pinski  <Andrew_pinski@playstation.sony.com>
 
         PR c++/31339
index 02b3822..c637f9f 100644 (file)
@@ -5357,7 +5357,14 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
             initializer.  It is not legal to redeclare a static data
             member, so this issue does not arise in that case.  */
          if (var_definition_p && TREE_STATIC (decl))
-           expand_static_init (decl, init);
+           {
+             /* If a TREE_READONLY variable needs initialization
+                at runtime, it is no longer readonly and we need to
+                avoid MEM_READONLY_P being set on RTL created for it.  */
+             if (init && TREE_READONLY (decl))
+               TREE_READONLY (decl) = 0;
+             expand_static_init (decl, init);
+           }
        }
     }
 
index 7d2cb1b..d962250 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/31809
+       * g++.dg/opt/static5.C: New test.
+
 2007-05-30  Richard Guenther  <rguenther@suse.de>
 
        * g++.dg/dg.exp: Prune torture/.
diff --git a/gcc/testsuite/g++.dg/opt/static5.C b/gcc/testsuite/g++.dg/opt/static5.C
new file mode 100644 (file)
index 0000000..1daca6d
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/31809
+// { dg-do run }
+// { dg-options "-O2" }
+
+struct S
+{
+  unsigned v;
+  static inline S f (unsigned a);
+};
+
+inline S
+S::f (unsigned a)
+{
+  static S t = { a };
+  return t;
+}
+
+const static S s = S::f (26);
+
+extern "C" void abort (void);
+
+int
+main ()
+{
+  S t = s;
+  if (t.v != 26)
+    abort ();
+  return 0;
+}