From 27edb5482d77d61a5adafd1851d61f4ecefe6361 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 30 May 2007 23:24:24 +0200 Subject: [PATCH] re PR c++/31809 (sometimes TREE_READONLY is still set for non read only variables causing wrong code) PR c++/31809 * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC variables that need runtime initialization. * g++.dg/opt/static5.C: New test. From-SVN: r125201 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 9 ++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/static5.C | 29 +++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/static5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9dca96afcad..c3d6b0b14e2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-05-30 Jakub Jelinek + + PR c++/31809 + * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC + variables that need runtime initialization. + 2007-05-28 Andrew Pinski PR c++/31339 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 02b38225a9e..c637f9ff882 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5357,7 +5357,14 @@ 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 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 && TREE_READONLY (decl)) + TREE_READONLY (decl) = 0; + expand_static_init (decl, init); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7d2cb1b9d6f..d962250780b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-30 Jakub Jelinek + + PR c++/31809 + * g++.dg/opt/static5.C: New test. + 2007-05-30 Richard Guenther * g++.dg/dg.exp: Prune torture/. diff --git a/gcc/testsuite/g++.dg/opt/static5.C b/gcc/testsuite/g++.dg/opt/static5.C new file mode 100644 index 00000000000..1daca6d7194 --- /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; +}