aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2007-04-11 08:18:28 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2007-04-11 06:18:28 +0000
commitffd343926959a175219f705631f6c649bdfdff2a (patch)
treeb44cdfcdef1b3171d3b746ae6f2c7d255425339c /gcc
parent113008b54b1405325b472e7eef9811c1340560f3 (diff)
downloadgcc-ffd343926959a175219f705631f6c649bdfdff2a.zip
gcc-ffd343926959a175219f705631f6c649bdfdff2a.tar.gz
gcc-ffd343926959a175219f705631f6c649bdfdff2a.tar.bz2
class.c (convert_to_base_statically): Fold produced tree; verify that we are not processing template_decl.
* cp/class.c (convert_to_base_statically): Fold produced tree; verify that we are not processing template_decl. From-SVN: r123711
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/class.c14
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b9823db..38ce783 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-11 Jan Hubicka <jh@suse.cz>
+
+ * cp/class.c (convert_to_base_statically): Fold produced tree; verify
+ that we are not processing template_decl.
+
2007-04-09 Mark Mitchell <mark@codesourcery.com>
PR c++/31449
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index e01fbe1..953cdff 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -531,12 +531,18 @@ convert_to_base_statically (tree expr, tree base)
tree pointer_type;
pointer_type = build_pointer_type (expr_type);
+
+ /* We use fold_build2 and fold_convert below to simplify the trees
+ provided to the optimizers. It is not safe to call these functions
+ when processing a template because they do not handle C++-specific
+ trees. */
+ gcc_assert (!processing_template_decl);
expr = build_unary_op (ADDR_EXPR, expr, /*noconvert=*/1);
if (!integer_zerop (BINFO_OFFSET (base)))
- expr = build2 (PLUS_EXPR, pointer_type, expr,
- build_nop (pointer_type, BINFO_OFFSET (base)));
- expr = build_nop (build_pointer_type (BINFO_TYPE (base)), expr);
- expr = build1 (INDIRECT_REF, BINFO_TYPE (base), expr);
+ expr = fold_build2 (PLUS_EXPR, pointer_type, expr,
+ fold_convert (pointer_type, BINFO_OFFSET (base)));
+ expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr);
+ expr = build_fold_indirect_ref (expr);
}
return expr;