diff options
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 19 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 1 |
3 files changed, 17 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 93d36842529..37d322a61f5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-04-01 Richard Henderson <rth@redhat.com> + + PR c++/14804 + * decl.c (cp_finish_decl): Preserve TREE_READONLY more often. + * typeck2.c (split_nonconstant_init): Clear TREE_READONLY. + 2004-04-01 Mark Mitchell <mark@codesourcery.com> PR c++/14810 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4570d8b7549..b228cd07748 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4753,16 +4753,17 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) if (TREE_CODE (decl) != FUNCTION_DECL) ttype = target_type (type); - if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl) - && (TYPE_NEEDS_CONSTRUCTING (type) - || TREE_CODE (type) == REFERENCE_TYPE)) - { - /* Currently, GNU C++ puts constants in text space, making them - impossible to initialize. In the future, one would hope for - an operating system which understood the difference between - initialization and the running of a program. */ + + /* Currently, GNU C++ puts constants in text space, making them + impossible to initialize. In the future, one would hope for + an operating system which understood the difference between + initialization and the running of a program. */ + if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)) + { was_readonly = 1; - TREE_READONLY (decl) = 0; + if (TYPE_NEEDS_CONSTRUCTING (type) + || TREE_CODE (type) == REFERENCE_TYPE) + TREE_READONLY (decl) = 0; } if (TREE_CODE (decl) == VAR_DECL) diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 63144565e48..0a0fdbc0311 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -380,6 +380,7 @@ split_nonconstant_init (tree dest, tree init) code = build1 (STMT_EXPR, void_type_node, code); TREE_SIDE_EFFECTS (code) = 1; DECL_INITIAL (dest) = init; + TREE_READONLY (dest) = 0; } else code = build (INIT_EXPR, TREE_TYPE (dest), dest, init); |