diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-06 09:33:25 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-06 09:33:25 +0100 |
commit | b0eb6a8f727aa18463fef3014ad115b7292223a2 (patch) | |
tree | 2f597e8ee37697beafd9819a18e4b6c5ce91866c | |
parent | 36b6e793433a2558e6f0f83a49bd61ead46183e4 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 67 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/datasec1.C | 10 |
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; |