From d40627f9335050467ae3fdb8bcf31ed695b290ea Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 19 Oct 2016 11:10:54 +0100 Subject: [PATCH] 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. From-SVN: r241332 --- libstdc++-v3/ChangeLog | 6 ++ .../20_util/unique_ptr/cons/cv_qual.cc | 26 ------- .../20_util/unique_ptr/cons/cv_qual_neg.cc | 72 +++++++++++++++++++ 3 files changed, 78 insertions(+), 26 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 200a5bdbcda..f2a143ea106 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2016-10-19 Jonathan Wakely + * 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. + * include/experimental/bits/shared_ptr.h (__shared_ptr<__libfund_v1<_Tp, false>, _Lp>::_Compatible): Just use is_convertible for non-array specialization. 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 829d11283cf..8d6847b76c0 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 00000000000..d744c1b7013 --- /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" } +} -- 2.30.2