From 6d24ae1f2a4e211f2c1cbb5c862a959180b2ef0f Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Wed, 20 Jun 2007 16:27:23 +0000 Subject: [PATCH] backport: [multiple changes] 2007-06-20 Dirk Mueller PR c++/31809 PR c++/31806 Backport from mainline: 2007-05-31 Jakub Jelinek * decl.c (cp_finish_decl): Also clear was_readonly if a static var needs runtime initialization. 2007-05-30 Jakub Jelinek * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC variables that need runtime initialization. * g++.dg/opt/static5.C: New testcase * g++.dg/opt/static6.C: Likewise From-SVN: r125887 --- gcc/cp/ChangeLog | 15 +++++++++++++ gcc/cp/decl.c | 10 ++++++++- gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/g++.dg/opt/static5.C | 29 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/static6.C | 35 ++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/static5.C create mode 100644 gcc/testsuite/g++.dg/opt/static6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c330b427dec2..9cb6d56e2700 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,18 @@ +2007-06-20 Dirk Mueller + + PR c++/31809 + PR c++/31806 + Backport from mainline: + 2007-05-31 Jakub Jelinek + + * decl.c (cp_finish_decl): Also clear was_readonly if a static var + needs runtime initialization. + + 2007-05-30 Jakub Jelinek + + * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC + variables that need runtime initialization. + 2007-04-28 Andrew Pinski PR C++/30221 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3b9c470f6f83..32040abfa4f8 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5240,7 +5240,15 @@ 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 (init) + { + if (TREE_READONLY (decl)) + TREE_READONLY (decl) = 0; + was_readonly = 0; + } + expand_static_init (decl, init); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7cdf183da287..604970b1432f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-06-20 Dirk Mueller + + PR c++/31806 + PR c++/31809 + * g++.dg/opt/static5.C: New test. + * g++.dg/opt/static6.C: New test. + 2007-06-20 Jakub Jelinek PR inline-asm/32109 diff --git a/gcc/testsuite/g++.dg/opt/static5.C b/gcc/testsuite/g++.dg/opt/static5.C new file mode 100644 index 000000000000..1daca6d71943 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static5.C @@ -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; +} diff --git a/gcc/testsuite/g++.dg/opt/static6.C b/gcc/testsuite/g++.dg/opt/static6.C new file mode 100644 index 000000000000..00e76fb73503 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static6.C @@ -0,0 +1,35 @@ +// PR c++/31806 +// { dg-do run } +// { dg-options "-O2 -fno-inline -fno-threadsafe-statics" } + +extern "C" void abort(void); + +struct A +{ + void *d; +}; + +static const A& staticA() +{ + static A s_static; + return s_static; +} + +void assert_failed() +{ + abort(); +} + +A testMethod() +{ + static const A& s = staticA( ); + if (&s == 0) + assert_failed(); + return s; +} + +int main() +{ + testMethod(); + return 0; +} -- 2.47.2