diff options
author | Andrew Pinski <pinskia@gcc.gnu.org> | 2005-05-31 09:40:09 -0700 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2005-05-31 09:40:09 -0700 |
commit | d763bb10051498ab4bafe220b644f2aa414de381 (patch) | |
tree | 841cd73dd378c353190d93fd81e931ed2544fbee /gcc/fold-const.c | |
parent | fb03baf21043a29fe3ca5bc66b06eb2b41ea2365 (diff) | |
download | gcc-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.c | 11 |
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) |