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
This commit is contained in:
Jakub Jelinek 2007-05-30 23:24:24 +02:00 committed by Jakub Jelinek
parent 859fa3b874
commit 27edb5482d
4 changed files with 48 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2007-05-30 Jakub Jelinek <jakub@redhat.com>
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 <Andrew_pinski@playstation.sony.com>
PR c++/31339

View File

@ -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);
}
}
}

View File

@ -1,3 +1,8 @@
2007-05-30 Jakub Jelinek <jakub@redhat.com>
PR c++/31809
* g++.dg/opt/static5.C: New test.
2007-05-30 Richard Guenther <rguenther@suse.de>
* g++.dg/dg.exp: Prune torture/.

View File

@ -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;
}