From 2228a8a3f2d69f36d98bc213ed85fec3f248dfdd Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 19 Aug 2015 22:35:07 +0000 Subject: [PATCH] More unique_ptr test cleanup. Fixes in to come later. llvm-svn: 245512 --- .../std/utilities/memory/unique.ptr/deleter.h | 1 - .../move_convert13.fail.cpp | 2 +- .../auto_pointer.pass.cpp | 16 +- .../move_convert.pass.cpp | 192 +++++++++--------- .../pointer_deleter04.fail.cpp | 43 +--- 5 files changed, 118 insertions(+), 136 deletions(-) diff --git a/libcxx/test/std/utilities/memory/unique.ptr/deleter.h b/libcxx/test/std/utilities/memory/unique.ptr/deleter.h index ab13c65105de..1d8e19d5bc41 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/deleter.h +++ b/libcxx/test/std/utilities/memory/unique.ptr/deleter.h @@ -112,7 +112,6 @@ public: ~Deleter() {assert(state_ >= 0); state_ = -1;} -private: template Deleter(Deleter d, typename std::enable_if::value>::type* = 0) diff --git a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp index 56ab43c7de24..412648420d46 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp +++ b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp @@ -32,5 +32,5 @@ int main() { std::unique_ptr s; std::unique_ptr s2; - s2 = std::move(s); + s2 = std::move(s); // expected-error {{no viable overloaded '='}} } diff --git a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp index 1ce1838afbb7..7c3ac462c287 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp +++ b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp @@ -7,17 +7,21 @@ // //===----------------------------------------------------------------------===// +// libc++ cannot safely provide the auto_ptr constructor without rvalue +// references. +// XFAIL: c++98, c++03 + // // unique_ptr -// Test unique_ptr(pointer) ctor +// template unique_ptr(auto_ptr&&) noexcept #include #include #include -// template explicit unique_ptr(auto_ptr&); +#include "test_macros.h" struct A { @@ -65,4 +69,12 @@ int main() } assert(A::count == 0); assert(B::count == 0); +#if TEST_STD_VER >= 11 + { + static_assert(std::is_nothrow_constructible< + std::unique_ptr, + std::auto_ptr&& + >::value, ""); + } +#endif } diff --git a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp index 7136253f33e8..f00fcfe15b80 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp +++ b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp @@ -18,6 +18,7 @@ // XFAIL: c++98, c++03 + #include #include #include @@ -50,126 +51,121 @@ struct B int B::count = 0; -template -void checkDeleter(OrigPtr& O, NewPtr& N, int OrigState, int NewState) { - typedef typename NewPtr::deleter_type NewDel; - if (std::is_reference::value) { - O.get_deleter().set_state(42); - assert(O.get_deleter().state() == 42); - assert(N.get_deleter().state() == 42); - O.get_deleter().set_state(99); - assert(O.get_deleter().state() == 99); - assert(N.get_deleter().state() == 99); - } else { - // TODO(EricWF) Enable this? - // assert(OrigState != NewState); - assert(O.get_deleter().state() == OrigState); - assert(N.get_deleter().state() == NewState); - } + +template +void checkReferenceDeleter(LHS& lhs, RHS& rhs) { + typedef typename LHS::deleter_type NewDel; + static_assert(std::is_reference::value, ""); + rhs.get_deleter().set_state(42); + assert(rhs.get_deleter().state() == 42); + assert(lhs.get_deleter().state() == 42); + lhs.get_deleter().set_state(99); + assert(lhs.get_deleter().state() == 99); + assert(rhs.get_deleter().state() == 99); } -template -void testMoveConvertExplicit() -{ - { // Test explicit constructor - BPtr s(new B); - A* p = s.get(); - APtr s2(std::move(s)); - assert(s2.get() == p); - assert(s.get() == 0); - assert(A::count == 1); - assert(B::count == 1); - } +template +void checkDeleter(LHS& lhs, RHS& rhs, int LHSVal, int RHSVal) { + assert(lhs.get_deleter().state() == LHSVal); + assert(rhs.get_deleter().state() == RHSVal); +} + +template +void checkCtor(LHS& lhs, RHS& rhs, A* RHSVal) { + assert(lhs.get() == RHSVal); + assert(rhs.get() == nullptr); + assert(A::count == 1); + assert(B::count == 1); +} + +void checkNoneAlive() { assert(A::count == 0); assert(B::count == 0); } -template -void testMoveConvertImplicit() { - - { // Test implicit constructor - BPtr s(new B); - A* p = s.get(); - APtr s2 = std::move(s); - assert(s2.get() == p); - assert(s.get() == 0); - assert(A::count == 1); - assert(B::count == 1); - } - assert(A::count == 0); - assert(B::count == 0); -} - -template -#if TEST_STD_VER >= 11 -void testMoveConvertExplicit(Deleter&& del) { -#else -void testMoveConvert(Deleter& del) { -#endif - int old_val = del.state(); - { // Test Explicit constructor - BPtr s(new B, std::forward(del)); - A* p = s.get(); - APtr s2(std::move(s)); - assert(s2.get() == p); - assert(s.get() == 0); - checkDeleter(s, s2, del.state(), old_val); - assert(A::count == 1); - assert(B::count == 1); - } - assert(A::count == 0); - assert(B::count == 0); -} - - -template -#if TEST_STD_VER >= 11 -void testMoveConvertImplicit(Deleter&& del) { -#else -void testMoveConvertImplicit(Deleter& del) { -#endif - int old_val = del.state(); - { // Test Implicit constructor - BPtr s(new B, std::forward(del)); - A* p = s.get(); - APtr s2 = std::move(s); - assert(s2.get() == p); - assert(s.get() == 0); - checkDeleter(s, s2, del.state(), old_val); - assert(A::count == 1); - assert(B::count == 1); - } - assert(A::count == 0); - assert(B::count == 0); -} int main() { { typedef std::unique_ptr APtr; typedef std::unique_ptr BPtr; - testMoveConvertExplicit(); - testMoveConvertImplicit(); + { // explicit + BPtr b(new B); + A* p = b.get(); + APtr a(std::move(b)); + checkCtor(a, b, p); + } + checkNoneAlive(); + { // implicit + BPtr b(new B); + A* p = b.get(); + APtr a = std::move(b); + checkCtor(a, b, p); + } + checkNoneAlive(); } - { + { // test with moveable deleters typedef std::unique_ptr > APtr; typedef std::unique_ptr > BPtr; - Deleter del(5); - testMoveConvertExplicit(std::move(del)); - del.set_state(5); - testMoveConvertImplicit(std::move(del)); + { + Deleter del(5); + BPtr b(new B, std::move(del)); + A* p = b.get(); + APtr a(std::move(b)); + checkCtor(a, b, p); + checkDeleter(a, b, 5, 0); + } + checkNoneAlive(); + { + Deleter del(5); + BPtr b(new B, std::move(del)); + A* p = b.get(); + APtr a = std::move(b); + checkCtor(a, b, p); + checkDeleter(a, b, 5, 0); + } + checkNoneAlive(); + } - { + { // test with reference deleters typedef std::unique_ptr& > APtr; typedef std::unique_ptr& > BPtr; NCDeleter del(5); - testMoveConvertExplicit(del); - testMoveConvertImplicit(del); + { + BPtr b(new B, del); + A* p = b.get(); + APtr a(std::move(b)); + checkCtor(a, b, p); + checkReferenceDeleter(a, b); + } + checkNoneAlive(); + { + BPtr b(new B, del); + A* p = b.get(); + APtr a = std::move(b); + checkCtor(a, b, p); + checkReferenceDeleter(a, b); + } + checkNoneAlive(); } { typedef std::unique_ptr > APtr; typedef std::unique_ptr& > BPtr; CDeleter del(5); - testMoveConvertImplicit(del); - testMoveConvertExplicit(del); + { + BPtr b(new B, del); + A* p = b.get(); + APtr a(std::move(b)); + checkCtor(a, b, p); + checkDeleter(a, b, 5, 5); + } + checkNoneAlive(); + { + BPtr b(new B, del); + A* p = b.get(); + APtr a = std::move(b); + checkCtor(a, b, p); + checkDeleter(a, b, 5, 5); + } + checkNoneAlive(); } } diff --git a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp index 7cacd1fda9f3..ad64b5e4ea39 100644 --- a/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp +++ b/libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp @@ -7,49 +7,24 @@ // //===----------------------------------------------------------------------===// +// Without rvalue references it is impossible to detect when a rvalue deleter +// is given. +// XFAIL: c++98, c++03 + // // unique_ptr -// Test unique_ptr(pointer) ctor - -#include -#include - // unique_ptr(pointer, D()) should not compile -struct A -{ - static int count; - A() {++count;} - A(const A&) {++count;} - ~A() {--count;} -}; +#include -int A::count = 0; - -class Deleter -{ - int state_; - -public: - - Deleter() : state_(5) {} - - int state() const {return state_;} - void set_state(int s) {state_ = s;} - - void operator()(A* p) const {delete p;} +struct Deleter { + void operator()(int* p) const {delete p;} }; int main() { - { - A* p = new A; - assert(A::count == 1); - std::unique_ptr s(p, Deleter()); - assert(s.get() == p); - assert(s.get_deleter().state() == 5); - } - assert(A::count == 0); + // expected-error@memory:* {{static_assert failed "rvalue deleter bound to reference"}} + std::unique_ptr s((int*)nullptr, Deleter()); // expected-note {{requested here}} }