From cb8229af1c625929b284f40af42e52c27ce047e8 Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 6 Nov 2007 08:33:25 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129922 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/decl.c | 67 ++++++++++++++++------------------- gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/g++.dg/other/datasec1.C | 10 ++++++ 4 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/datasec1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7f49a7262b2..2f0d55274b6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2007-11-06 Jakub Jelinek + 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 990d943ecca..ca5a9ca2483 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 8b04b28901f..1d9a9c6fe9a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-11-06 Jakub Jelinek + 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 00000000000..28dab019f71 --- /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; -- 2.11.0