From patchwork Wed Oct 19 10:10:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 78217 Delivered-To: patch@linaro.org Received: by 10.140.97.247 with SMTP id m110csp164350qge; Wed, 19 Oct 2016 03:11:32 -0700 (PDT) X-Received: by 10.98.184.25 with SMTP id p25mr9744249pfe.56.1476871891922; Wed, 19 Oct 2016 03:11:31 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id bu3si7422313pad.220.2016.10.19.03.11.31 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Oct 2016 03:11:31 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-438990-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-438990-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-438990-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:references:mime-version:content-type :in-reply-to; q=dns; s=default; b=oN0FitNoVCw7Td09fb+W9mnBqYxtiv gQ9lB0UZUGrVRDvyn6HWdBOZvnUQ/SorroEldcMqq7vH3iHpiOqLJpbl5vqoEbeC lrpzptYJhTaZv0Qmku7l6iiC6zCOkIdf3nJLAvcv/8BsVym9pbo6Xb/81h6YHiX/ pBnalhCCsxb+k= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:references:mime-version:content-type :in-reply-to; s=default; bh=kha3LiDDn7NwM/MfWuQVvxddz6Q=; b=OENi NcwF2Dy9k2xQnKXxBOS7rs4ajrGyd4FvxUpapIUBn4dMQF6wLx97nBsFKN1QRaOm SfWY4qCuT4JAK/4vlMyrAIKUPO5Szay4PsWUXjNPfF3QQubYHI+FKL5G0nJuSwqQ N3mXU1gwgAKWZSi6iRMQjiq4nUMFrIiAo84r2D8= Received: (qmail 46232 invoked by alias); 19 Oct 2016 10:11:06 -0000 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 Received: (qmail 46211 invoked by uid 89); 19 Oct 2016 10:11:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Disallow, cva, upa, upA3 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 19 Oct 2016 10:10:55 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68BC74E4DE; Wed, 19 Oct 2016 10:10:54 +0000 (UTC) Received: from localhost (ovpn-116-70.ams2.redhat.com [10.36.116.70]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u9JAArZi005053; Wed, 19 Oct 2016 06:10:54 -0400 Date: Wed, 19 Oct 2016 11:10:53 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: Re: [PATCH] PR77987 Fix unique_ptr::reset(U) for T != U Message-ID: <20161019101053.GX2922@redhat.com> References: <20161017120031.GI2922@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20161017120031.GI2922@redhat.com> X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.7.0 (2016-08-17) On 17/10/16 13:00 +0100, Jonathan Wakely wrote: >This is a very simple change, to allow conversions that are supposed >to be valid according to DR 2118. The fix was slightly complicated by >the tests being a bit of a mess. We had tests for this requirement, >but they were in files which mixed positive tests and negative tests. >I've split the tests so the invalid operations are in separate files >and all the valid operations are in files that should pass. > > PR libstdc++/77987 > * include/bits/unique_ptr.h (unique_ptr::reset(U)): Copy > value to pointer of the correct type to swap, to support conversions > allowed by LWG 2118 / N4089. > * testsuite/20_util/unique_ptr/assign/assign_neg.cc: Move test for > incompatible deleters from ... > * testsuite/20_util/unique_ptr/assign/cv_qual.cc: ... here. > * testsuite/20_util/unique_ptr/modifiers/cv_qual.cc: Move tests for > incompatible pointers to ... > * testsuite/20_util/unique_ptr/modifiers/reset_neg.cc: ... here. Move > destructor definition to base class. Test for invalid derived-to-base > conversion. > >I'll also backport this to the branches. Here's another case where we have positive and negative tests in the same file. I'm splitting this one too, and fixing one of the tests to match its comment. Tested powerpc64le-linux, comitted to trunk. commit 721248b4e099769f0c78d72bf951e7b2d7b8f95a Author: Jonathan Wakely Date: Wed Oct 19 11:05:26 2016 +0100 Move negative unique_ptr tests to new file * testsuite/20_util/unique_ptr/cons/cv_qual.cc: Move negative tests to new file. * testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc: New file. Fix test for incompatible deleters to not also use incompatible types. Add tests for incompatible array types. diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual.cc index 829d112..8d6847b 100644 --- a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual.cc +++ b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual.cc @@ -99,30 +99,4 @@ test07() std::unique_ptr cA2((A*)p); std::unique_ptr vA2((A*)p); std::unique_ptr cvA2((A*)p); - // Disallow conversions from user-defined pointer-like types - // for the array version - std::unique_ptr upA3(p); // { dg-error "no matching function" } - std::unique_ptr cA3(p); // { dg-error "no matching function" } - std::unique_ptr vA3(p); // { dg-error "no matching function" } - std::unique_ptr cvA3(p); // { dg-error "no matching function" } - // { dg-error "no type" "" { target *-*-* } 446 } } - -template -struct deleter -{ - deleter() = default; - template - deleter(const deleter) { } - typedef T pointer; - void operator()(T) const { } -}; - -void -test08() -{ - // Disallow conversions from non-assignable deleter - std::unique_ptr> p; - std::unique_ptr> upA(std::move(p)); // { dg-error "no matching function" } -} - diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc new file mode 100644 index 0000000..d744c1b --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc @@ -0,0 +1,72 @@ +// { dg-do compile { target c++11 } } + +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// 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 Class template unique_ptr [unique.ptr] + +#include + +struct A { virtual ~A() = default; }; + +struct B : A { }; + +// Construction from objects with different cv-qualification + +struct A_pointer { operator A*() const { return nullptr; } }; + +void +test07() +{ + A_pointer p; + // Disallow conversions from user-defined pointer-like types + // for the array version + std::unique_ptr upA3(p); // { dg-error "no matching function" } + std::unique_ptr cA3(p); // { dg-error "no matching function" } + std::unique_ptr vA3(p); // { dg-error "no matching function" } + std::unique_ptr cvA3(p); // { dg-error "no matching function" } + // { dg-error "no type" "" { target *-*-* } 446 } +} + +template +struct deleter +{ + deleter() = default; + template + deleter(const deleter) { } + typedef T pointer; + void operator()(T) const { } +}; + +void +test08() +{ + // Disallow conversions from non-assignable deleter + std::unique_ptr> p; + std::unique_ptr> upA(std::move(p)); // { dg-error "no matching function" } +} + +void +test011() +{ + // Disallow conversions between different array types. + std::unique_ptr upB; + + std::unique_ptr cA(std::move(upB)); // { dg-error "no matching function" } + std::unique_ptr vA(std::move(upB)); // { dg-error "no matching function" } + std::unique_ptr cvA(std::move(upB)); // { dg-error "no matching function" } +}