diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-04-30 07:16:51 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-04-30 07:16:51 -0400 |
commit | abd23b66b4c3e345de19758ccf461d936cefe5eb (patch) | |
tree | 07017592c861195672528edf86f22d5add523875 /gcc | |
parent | 1c4fadec3712890f734ae74347f2abe3436455cb (diff) | |
download | gcc-abd23b66b4c3e345de19758ccf461d936cefe5eb.zip gcc-abd23b66b4c3e345de19758ccf461d936cefe5eb.tar.gz gcc-abd23b66b4c3e345de19758ccf461d936cefe5eb.tar.bz2 |
(substitute_in_expr): Preserve TREE_READONLY.
From-SVN: r9546
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree.c | 65 |
1 files changed, 39 insertions, 26 deletions
@@ -2197,6 +2197,7 @@ substitute_in_expr (exp, f, r) tree r; { enum tree_code code = TREE_CODE (exp); + tree new = 0; tree inner; switch (TREE_CODE_CLASS (code)) @@ -2217,9 +2218,10 @@ substitute_in_expr (exp, f, r) switch (tree_code_length[(int) code]) { case 1: - return fold (build1 (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), - f, r))); + new = fold (build1 (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), + f, r))); + break; case 2: /* An RTL_EXPR cannot contain a PLACEHOLDER_EXPR; a CONSTRUCTOR @@ -2229,10 +2231,11 @@ substitute_in_expr (exp, f, r) else if (code == CONSTRUCTOR) abort (); - return fold (build (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), f, r), - substitute_in_expr (TREE_OPERAND (exp, 1), - f, r))); + new = fold (build (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), f, r), + substitute_in_expr (TREE_OPERAND (exp, 1), + f, r))); + break; case 3: /* It cannot be that anything inside a SAVE_EXPR contains a @@ -2243,11 +2246,11 @@ substitute_in_expr (exp, f, r) if (code != COND_EXPR) abort (); - return fold (build (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), f, r), - substitute_in_expr (TREE_OPERAND (exp, 1), f, r), - substitute_in_expr (TREE_OPERAND (exp, 2), - f, r))); + new = fold (build (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), f, r), + substitute_in_expr (TREE_OPERAND (exp, 1), f, r), + substitute_in_expr (TREE_OPERAND (exp, 2), + f, r))); } break; @@ -2266,29 +2269,39 @@ substitute_in_expr (exp, f, r) && TREE_OPERAND (exp, 1) == f) return r; - return fold (build (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), f, r), - TREE_OPERAND (exp, 1))); + new = fold (build (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), f, r), + TREE_OPERAND (exp, 1))); + break; + case BIT_FIELD_REF: - return fold (build (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), f, r), - substitute_in_expr (TREE_OPERAND (exp, 1), f, r), - substitute_in_expr (TREE_OPERAND (exp, 2), f, r))); + new = fold (build (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), f, r), + substitute_in_expr (TREE_OPERAND (exp, 1), f, r), + substitute_in_expr (TREE_OPERAND (exp, 2), f, r))); + break; + case INDIRECT_REF: case BUFFER_REF: - return fold (build1 (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), - f, r))); + new = fold (build1 (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), + f, r))); + break; + case OFFSET_REF: - return fold (build (code, TREE_TYPE (exp), - substitute_in_expr (TREE_OPERAND (exp, 0), f, r), - substitute_in_expr (TREE_OPERAND (exp, 1), f, r))); + new = fold (build (code, TREE_TYPE (exp), + substitute_in_expr (TREE_OPERAND (exp, 0), f, r), + substitute_in_expr (TREE_OPERAND (exp, 1), f, r))); + break; } } /* If it wasn't one of the cases we handle, give up. */ + if (new == 0) + abort (); - abort (); + TREE_READONLY (new) = TREE_READONLY (exp); + return new; } /* Given a type T, a FIELD_DECL F, and a replacement value R, |