re PR target/33168 (GCC Boot failure, building libstc++)
authorJakub Jelinek <jakub@redhat.com>
Tue, 6 Nov 2007 08:33:25 +0000 (09:33 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 6 Nov 2007 08:33:25 +0000 (09:33 +0100)
PR target/33168
* decl.c (cp_finish_decl): Call make_rtl_for_nonlocal_decl already
with the final TREE_READONLY flag in place.  processing_template_decl
is known to be 0 in this part of function.

* g++.dg/other/datasec1.C: New test.

From-SVN: r129922

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

index 7f49a7262b2e7b3a57dff42000f82c9f745f6d58..2f0d55274b62143fcd46e4c2e1895ddf5ffcf938 100644 (file)
@@ -1,5 +1,10 @@
 2007-11-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/33168
+       * decl.c (cp_finish_decl): Call make_rtl_for_nonlocal_decl already
+       with the final TREE_READONLY flag in place.  processing_template_decl
+       is known to be 0 in this part of function.
+
        PR c++/33894
        * cp-tree.h: Update comment - TYPE_LANG_FLAG_0 is not
        OMP_ATOMIC_DEPENDENT_P in OMP_ATOMIC.
index 990d943ecca69df810e99760723fa39ba49ebfac..ca5a9ca2483af97539a24e997f9b6e595fffadcd 100644 (file)
@@ -5455,8 +5455,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
         require a guard variable, and since the mangled name of the
         guard variable will depend on the mangled name of this
         variable.  */
-      if (!processing_template_decl
-         && DECL_FUNCTION_SCOPE_P (decl)
+      if (DECL_FUNCTION_SCOPE_P (decl)
          && TREE_STATIC (decl)
          && !DECL_ARTIFICIAL (decl))
        push_local_name (decl);
@@ -5561,6 +5560,21 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       /* This needs to happen after the linkage is set. */
       determine_visibility (decl);
 
+      if (var_definition_p && TREE_STATIC (decl))
+       {
+         /* 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)
+           {
+             if (TREE_READONLY (decl))
+               TREE_READONLY (decl) = 0;
+             was_readonly = 0;
+           }
+         else if (was_readonly)
+           TREE_READONLY (decl) = 1;
+       }
+
       make_rtl_for_nonlocal_decl (decl, init, asmspec);
 
       /* Check for abstractness of the type. Notice that there is no
@@ -5583,40 +5597,21 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
          if (init)
            DECL_INITIAL (decl) = init;
        }
-      else
-       {
-         /* A variable definition.  */
-         if (DECL_FUNCTION_SCOPE_P (decl))
-           {
-             /* Initialize the local variable.  */
-             if (processing_template_decl)
-               DECL_INITIAL (decl) = init;
-             else if (!TREE_STATIC (decl))
-               initialize_local_var (decl, init);
-           }
-
-         /* If a variable is defined, and then a subsequent
-            definition with external linkage is encountered, we will
-            get here twice for the same variable.  We want to avoid
-            calling expand_static_init more than once.  For variables
-            that are not static data members, we can call
-            expand_static_init only when we actually process the
-            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))
-           {
-             /* 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)
-               {
-                 if (TREE_READONLY (decl))
-                   TREE_READONLY (decl) = 0;
-                 was_readonly = 0;
-               }
-             expand_static_init (decl, init);
-           }
-       }
+      /* A variable definition.  */
+      else if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
+       /* Initialize the local variable.  */
+       initialize_local_var (decl, init);
+
+      /* If a variable is defined, and then a subsequent
+        definition with external linkage is encountered, we will
+        get here twice for the same variable.  We want to avoid
+        calling expand_static_init more than once.  For variables
+        that are not static data members, we can call
+        expand_static_init only when we actually process the
+        initializer.  It is not legal to redeclare a static data
+        member, so this issue does not arise in that case.  */
+      else if (var_definition_p && TREE_STATIC (decl))
+       expand_static_init (decl, init);
     }
 
   /* If a CLEANUP_STMT was created to destroy a temporary bound to a
index 8b04b28901fc7227a04f0e0eebb734da0cfd018f..1d9a9c6fe9a62ae46120373b66d67fbad5c0303a 100644 (file)
@@ -1,5 +1,8 @@
 2007-11-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/33168
+       * g++.dg/other/datasec1.C: New test.
+
        PR tree-optimization/33458
        * g++.dg/opt/inline12.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/other/datasec1.C b/gcc/testsuite/g++.dg/other/datasec1.C
new file mode 100644 (file)
index 0000000..28dab01
--- /dev/null
@@ -0,0 +1,10 @@
+// PR target/33168
+// { dg-do compile }
+// { dg-options "-O2 -fdata-sections" }
+
+extern const int& foo;
+namespace
+{
+  const int bar = 16;
+}
+const int &foo = bar;