re PR c++/62017 (AddressSanitizer reports *-buffer-overflow in destructor when multip...
authorJason Merrill <jason@redhat.com>
Sun, 21 Sep 2014 02:42:40 +0000 (22:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 21 Sep 2014 02:42:40 +0000 (22:42 -0400)
PR c++/62017
* decl.c (begin_destructor_body): Only clobber the as-base part of
*this.

From-SVN: r215427

gcc/cp/ChangeLog
gcc/cp/decl.c

index 2b537281e72916c62157950155acd4443f324532..857f58d4264101c018beb9456383af529dfbd51e 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/62017
+       * decl.c (begin_destructor_body): Only clobber the as-base part of
+       *this.
+
 2014-09-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/61392
index 59dada7d3db290387ffb501852bb029e7d049745..fe5a4af17b5a36632e4346394e5065a43d64be49 100644 (file)
@@ -13808,10 +13808,12 @@ begin_destructor_body (void)
 
       /* Insert a cleanup to let the back end know that the object is dead
         when we exit the destructor, either normally or via exception.  */
-      tree clobber = build_constructor (current_class_type, NULL);
+      tree btype = CLASSTYPE_AS_BASE (current_class_type);
+      tree clobber = build_constructor (btype, NULL);
       TREE_THIS_VOLATILE (clobber) = true;
-      tree exprstmt = build2 (MODIFY_EXPR, current_class_type,
-                             current_class_ref, clobber);
+      tree bref = build_nop (build_reference_type (btype), current_class_ptr);
+      bref = convert_from_reference (bref);
+      tree exprstmt = build2 (MODIFY_EXPR, btype, bref, clobber);
       finish_decl_cleanup (NULL_TREE, exprstmt);
 
       /* And insert cleanups for our bases and members so that they