aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-06 09:33:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-06 09:33:25 +0100
commitb0eb6a8f727aa18463fef3014ad115b7292223a2 (patch)
tree2f597e8ee37697beafd9819a18e4b6c5ce91866c
parent36b6e793433a2558e6f0f83a49bd61ead46183e4 (diff)
downloadgcc-b0eb6a8f727aa18463fef3014ad115b7292223a2.zip
gcc-b0eb6a8f727aa18463fef3014ad115b7292223a2.tar.gz
gcc-b0eb6a8f727aa18463fef3014ad115b7292223a2.tar.bz2
re PR target/33168 (GCC Boot failure, building libstc++)
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c67
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/other/datasec1.C10
4 files changed, 49 insertions, 36 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7f49a72..2f0d552 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 990d943..ca5a9ca 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8b04b28..1d9a9c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..28dab01
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/datasec1.C
@@ -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;