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:
parent
859fa3b874
commit
27edb5482d
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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/.
|
||||
|
29
gcc/testsuite/g++.dg/opt/static5.C
Normal file
29
gcc/testsuite/g++.dg/opt/static5.C
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user