From patchwork Sun Aug 26 00:16:21 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 180008 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 044922C00D8 for ; Sun, 26 Aug 2012 10:16:46 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1346545007; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:Date:Message-ID:Subject:From:To: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=xQbp32s ViAVoHZFLcFJM1wWWRn8=; b=W9lwICPYrRARggMaIkBnqnEy1rORjyp0TAsf2dB yhQlB7FqIO8jwfh47EVVorqsTR1eaXCStOoIloMEgui3WLisPc1kHIkexjFVusFq TqgCZcBznMWEuhgPKwKLL6HbBAvRpBo2/4xCy6sjFO/5g34B/63+kjUamfwCp0UO IJs0= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:MIME-Version:Received:Received:Date:Message-ID:Subject:From:To:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=uQnTq8uACP84DzWNKmyi+fqfSkHRWi995pRANa7Ro4ZJJGCKvEN6NFVBn/Bf3l KNn/zdRCvFrKpdNWTnOcUxCMI1IGblNaABh7TS5G8ArvFht+ioSgdn8lCRnacf1P zfgk+FGT92162GZl/FO+pisvY2PYF8+Z958oOZFi1VSxo=; Received: (qmail 13446 invoked by alias); 26 Aug 2012 00:16:39 -0000 Received: (qmail 13423 invoked by uid 22791); 26 Aug 2012 00:16:37 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-iy0-f175.google.com (HELO mail-iy0-f175.google.com) (209.85.210.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 26 Aug 2012 00:16:23 +0000 Received: by iaky10 with SMTP id y10so6064108iak.20 for ; Sat, 25 Aug 2012 17:16:21 -0700 (PDT) MIME-Version: 1.0 Received: by 10.50.212.98 with SMTP id nj2mr6088987igc.35.1345940181569; Sat, 25 Aug 2012 17:16:21 -0700 (PDT) Received: by 10.42.49.81 with HTTP; Sat, 25 Aug 2012 17:16:21 -0700 (PDT) Date: Sun, 26 Aug 2012 01:16:21 +0100 Message-ID: Subject: [v3] fix PR 54351 From: Jonathan Wakely To: "libstdc++" , gcc-patches Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 2012-08-26 Jonathan Wakely Geoff Romer PR libstdc++/54351 * include/bits/unique_ptr.h (unique_ptr::~unique_ptr): Do not use reset(). (unique_ptr::~unique_ptr()): Likewise. * testsuite/20_util/unique_ptr/54351.cc: New. * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Adjust dg-error line numbers. Tested x86_64-linux, committed to trunk, will commit to 4.7 too. commit d88d836f7398e0e81ef8c0c2d08abfbe16489024 Author: Jonathan Wakely Date: Sat Aug 25 21:00:24 2012 +0100 PR libstdc++/54351 * include/bits/unique_ptr.h (unique_ptr::~unique_ptr): Do not use reset(). (unique_ptr::~unique_ptr()): Likewise. * testsuite/20_util/unique_ptr/54351.cc: New. * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Adjust dg-error line numbers. diff --git a/libstdc++-v3/include/bits/unique_ptr.h b/libstdc++-v3/include/bits/unique_ptr.h index 242d01e..37eae25 100644 --- a/libstdc++-v3/include/bits/unique_ptr.h +++ b/libstdc++-v3/include/bits/unique_ptr.h @@ -169,7 +169,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif // Destructor. - ~unique_ptr() noexcept { reset(); } + ~unique_ptr() noexcept + { + auto& __ptr = std::get<0>(_M_t); + if (__ptr != nullptr) + get_deleter()(__ptr); + __ptr = pointer(); + } // Assignment. unique_ptr& @@ -313,7 +319,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { } // Destructor. - ~unique_ptr() { reset(); } + ~unique_ptr() + { + auto& __ptr = std::get<0>(_M_t); + if (__ptr != nullptr) + get_deleter()(__ptr); + __ptr = pointer(); + } // Assignment. unique_ptr& diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/54351.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/54351.cc new file mode 100644 index 0000000..2565e62 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/unique_ptr/54351.cc @@ -0,0 +1,70 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do run } + +// Copyright (C) 2012 Free Software Foundation +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// 20.7.1 Template class unique_ptr [unique.ptr] + +#include +#include + +struct A; + +struct B +{ + std::unique_ptr a; +}; + +struct A +{ + B* b; + ~A() { VERIFY(b->a != nullptr); } +}; + +void test01() +{ + B b; + b.a.reset(new A); + b.a->b = &b; +} + +struct C; + +struct D +{ + std::unique_ptr c; +}; + +struct C +{ + D* d; + ~C() { VERIFY(d->c != nullptr); } +}; + +void test02() +{ + D d; + d.c.reset(new C[1]); + d.c[0].d = &d; +} + +int main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc index d72821e..3a4f9b4 100644 --- a/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc +++ b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc @@ -41,10 +41,10 @@ void f() std::unique_ptr ub(nullptr, b); std::unique_ptr ud(nullptr, d); ub = std::move(ud); -// { dg-error "use of deleted function" "" { target *-*-* } 192 } +// { dg-error "use of deleted function" "" { target *-*-* } 198 } std::unique_ptr uba(nullptr, b); std::unique_ptr uda(nullptr, d); uba = std::move(uda); -// { dg-error "use of deleted function" "" { target *-*-* } 332 } +// { dg-error "use of deleted function" "" { target *-*-* } 344 } }