]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/15097 (code generator problem with ::delete and multiple inheritance and...
authorJason Merrill <jason@redhat.com>
Thu, 13 Sep 2007 13:42:11 +0000 (09:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 13 Sep 2007 13:42:11 +0000 (09:42 -0400)
        PR c++/15097
        * init.c (build_delete): Use build_headof to get the address of the
        complete object if we aren't using the deleting destructor.
        * rtti.c (build_headof): No longer static.
        * cp-tree.h: Declare it.

From-SVN: r128464

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/init.c
gcc/cp/rtti.c

index e975e4b17927f82290c0b3a69540df4b4c81c947..6a1d20d872812156792c9013d98b5967f8764f0e 100644 (file)
@@ -1,3 +1,11 @@
+2007-09-13  Jason Merrill  <jason@redhat.com>
+
+       PR c++/15097
+       * init.c (build_delete): Use build_headof to get the address of the
+       complete object if we aren't using the deleting destructor.
+       * rtti.c (build_headof): No longer static.
+       * cp-tree.h: Declare it.
+
 2007-09-11  Jason Merrill  <jason@redhat.com>
 
        PR c++/31419
index f35a19a7ad6a0c3fda4c54c43f2b8659280bf86c..48d8de8ff20213101698f3821b0b809feeccc003 100644 (file)
@@ -4178,6 +4178,7 @@ extern void init_rtti_processing          (void);
 extern tree build_typeid                       (tree);
 extern tree get_tinfo_decl                     (tree);
 extern tree get_typeid                         (tree);
+extern tree build_headof                       (tree);
 extern tree build_dynamic_cast                 (tree, tree);
 extern void emit_support_tinfos                        (void);
 extern bool emit_tinfo_decl                    (tree);
index 8125f189f8564a3a2e784c2aba03736631311469..3c570c842f377891b53a6a5219fea611342e8db7 100644 (file)
@@ -2788,6 +2788,7 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
     }
   else
     {
+      tree head = NULL_TREE;
       tree do_delete = NULL_TREE;
       tree ifexp;
 
@@ -2801,8 +2802,9 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
        {
          /* We will use ADDR multiple times so we must save it.  */
          addr = save_expr (addr);
+         head = get_target_expr (build_headof (addr));
          /* Delete the object.  */
-         do_delete = build_builtin_delete_call (addr);
+         do_delete = build_builtin_delete_call (head);
          /* Otherwise, treat this like a complete object destructor
             call.  */
          auto_delete = sfk_complete_destructor;
@@ -2841,6 +2843,10 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
       if (do_delete)
        expr = build2 (COMPOUND_EXPR, void_type_node, expr, do_delete);
 
+      /* We need to calculate this before the dtor changes the vptr.  */
+      if (head)
+       expr = build2 (COMPOUND_EXPR, void_type_node, head, expr);
+
       if (flags & LOOKUP_DESTRUCTOR)
        /* Explicit destructor call; don't check for null pointer.  */
        ifexp = integer_one_node;
index 9605479e826516279741c07f30d103947a09d459..dcf4e72ad7e64da5f37444a2f2f4d145e8135aff 100644 (file)
@@ -100,7 +100,6 @@ VEC(tree,gc) *unemitted_tinfo_decls;
    and are generated as needed. */
 static GTY (()) VEC(tinfo_s,gc) *tinfo_descs;
 
-static tree build_headof (tree);
 static tree ifnonnull (tree, tree);
 static tree tinfo_name (tree);
 static tree build_dynamic_cast_1 (tree, tree);
@@ -154,7 +153,7 @@ init_rtti_processing (void)
    virtual functions (TYPE_POLYMORPHIC_P), else just return the
    expression.  */
 
-static tree
+tree
 build_headof (tree exp)
 {
   tree type = TREE_TYPE (exp);