class.c (convert_to_base_statically): Fold produced tree; verify that we are not...
authorJan Hubicka <jh@suse.cz>
Wed, 11 Apr 2007 06:18:28 +0000 (08:18 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 11 Apr 2007 06:18:28 +0000 (06:18 +0000)
* cp/class.c (convert_to_base_statically): Fold produced tree; verify
that we are not processing template_decl.

From-SVN: r123711

gcc/cp/ChangeLog
gcc/cp/class.c

index b9823db..38ce783 100644 (file)
@@ -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
index e01fbe1..953cdff 100644 (file)
@@ -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;