aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-04-30 07:16:51 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-04-30 07:16:51 -0400
commitabd23b66b4c3e345de19758ccf461d936cefe5eb (patch)
tree07017592c861195672528edf86f22d5add523875 /gcc
parent1c4fadec3712890f734ae74347f2abe3436455cb (diff)
downloadgcc-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.c65
1 files changed, 39 insertions, 26 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index fcbfd53..e8038d7 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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,