aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@gcc.gnu.org>2005-05-31 09:40:09 -0700
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-05-31 09:40:09 -0700
commitd763bb10051498ab4bafe220b644f2aa414de381 (patch)
tree841cd73dd378c353190d93fd81e931ed2544fbee /gcc/fold-const.c
parentfb03baf21043a29fe3ca5bc66b06eb2b41ea2365 (diff)
downloadgcc-d763bb10051498ab4bafe220b644f2aa414de381.zip
gcc-d763bb10051498ab4bafe220b644f2aa414de381.tar.gz
gcc-d763bb10051498ab4bafe220b644f2aa414de381.tar.bz2
[multiple changes]
2005-05-31 Andrew pinski <pinskia@physics.uc.edu> PR middle-end/20931 * g++.dg/opt/pr20931.C: New test. 2005-05-31 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/20931 PR middle-end/20946 * fold-const.c (fold_checksum_tree): Copy types also if TYPE_CONTAINS_PLACEHOLDER_INTERNAL is set. Don't call fold_checksum_tree for TREE_LIST's TREE_CHAIN first. Tail recurse TREE_LIST's TREE_CHAIN. From-SVN: r100397
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index c780659..97caf15 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -10419,6 +10419,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
enum tree_code code;
char buf[sizeof (struct tree_decl)];
int i, len;
+
+recursive_label:
gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
<= sizeof (struct tree_decl))
@@ -10440,11 +10442,13 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
}
else if (TREE_CODE_CLASS (code) == tcc_type
&& (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
- || TYPE_CACHED_VALUES_P (expr)))
+ || TYPE_CACHED_VALUES_P (expr)
+ || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
{
/* Allow these fields to be modified. */
memcpy (buf, expr, tree_size (expr));
expr = (tree) buf;
+ TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
TYPE_POINTER_TO (expr) = NULL;
TYPE_REFERENCE_TO (expr) = NULL;
if (TYPE_CACHED_VALUES_P (expr))
@@ -10456,7 +10460,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
md5_process_bytes (expr, tree_size (expr), ctx);
fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
if (TREE_CODE_CLASS (code) != tcc_type
- && TREE_CODE_CLASS (code) != tcc_declaration)
+ && TREE_CODE_CLASS (code) != tcc_declaration
+ && code != TREE_LIST)
fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
switch (TREE_CODE_CLASS (code))
{
@@ -10484,6 +10489,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
case TREE_LIST:
fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
+ expr = TREE_CHAIN (expr);
+ goto recursive_label;
break;
case TREE_VEC:
for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)