[libcxx] r245512 - More unique_ptr test cleanup. Fixes in <memory> to come later.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 19 15:35:07 PDT 2015
Author: ericwf
Date: Wed Aug 19 17:35:07 2015
New Revision: 245512
URL: http://llvm.org/viewvc/llvm-project?rev=245512&view=rev
Log:
More unique_ptr test cleanup. Fixes in <memory> to come later.
Modified:
libcxx/trunk/test/std/utilities/memory/unique.ptr/deleter.h
libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp
libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp
libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp
libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp
Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/deleter.h
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/deleter.h?rev=245512&r1=245511&r2=245512&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/memory/unique.ptr/deleter.h (original)
+++ libcxx/trunk/test/std/utilities/memory/unique.ptr/deleter.h Wed Aug 19 17:35:07 2015
@@ -112,7 +112,6 @@ public:
~Deleter() {assert(state_ >= 0); state_ = -1;}
-private:
template <class U>
Deleter(Deleter<U> d,
typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp?rev=245512&r1=245511&r2=245512&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp (original)
+++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.asgn/move_convert13.fail.cpp Wed Aug 19 17:35:07 2015
@@ -32,5 +32,5 @@ int main()
{
std::unique_ptr<A[], Deleter> s;
std::unique_ptr<A, Deleter> s2;
- s2 = std::move(s);
+ s2 = std::move(s); // expected-error {{no viable overloaded '='}}
}
Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp?rev=245512&r1=245511&r2=245512&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/auto_pointer.pass.cpp Wed Aug 19 17:35:07 2015
@@ -7,17 +7,21 @@
//
//===----------------------------------------------------------------------===//
+// libc++ cannot safely provide the auto_ptr constructor without rvalue
+// references.
+// XFAIL: c++98, c++03
+
// <memory>
// unique_ptr
-// Test unique_ptr(pointer) ctor
+// template <class U> unique_ptr(auto_ptr<U>&&) noexcept
#include <memory>
#include <utility>
#include <cassert>
-// template <class U> explicit unique_ptr(auto_ptr<U>&);
+#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<A>,
+ std::auto_ptr<B>&&
+ >::value, "");
+ }
+#endif
}
Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp?rev=245512&r1=245511&r2=245512&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/move_convert.pass.cpp Wed Aug 19 17:35:07 2015
@@ -18,6 +18,7 @@
// XFAIL: c++98, c++03
+
#include <memory>
#include <type_traits>
#include <utility>
@@ -50,126 +51,121 @@ struct B
int B::count = 0;
-template <class OrigPtr, class NewPtr>
-void checkDeleter(OrigPtr& O, NewPtr& N, int OrigState, int NewState) {
- typedef typename NewPtr::deleter_type NewDel;
- if (std::is_reference<NewDel>::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 <class APtr, class BPtr>
-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);
- }
- assert(A::count == 0);
- assert(B::count == 0);
-}
-
-template <class APtr, class BPtr>
-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 <class LHS, class RHS>
+void checkReferenceDeleter(LHS& lhs, RHS& rhs) {
+ typedef typename LHS::deleter_type NewDel;
+ static_assert(std::is_reference<NewDel>::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 <class LHS, class RHS>
+void checkDeleter(LHS& lhs, RHS& rhs, int LHSVal, int RHSVal) {
+ assert(lhs.get_deleter().state() == LHSVal);
+ assert(rhs.get_deleter().state() == RHSVal);
+}
+
+template <class LHS, class RHS>
+void checkCtor(LHS& lhs, RHS& rhs, A* RHSVal) {
+ assert(lhs.get() == RHSVal);
+ assert(rhs.get() == nullptr);
+ assert(A::count == 1);
+ assert(B::count == 1);
}
-template <class APtr, class BPtr, class Deleter>
-#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<Deleter>(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);
- }
+void checkNoneAlive() {
assert(A::count == 0);
assert(B::count == 0);
}
-
-template <class APtr, class BPtr, class Deleter>
-#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<Deleter>(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<A> APtr;
typedef std::unique_ptr<B> BPtr;
- testMoveConvertExplicit<APtr, BPtr>();
- testMoveConvertImplicit<APtr, BPtr>();
+ { // 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<A, Deleter<A> > APtr;
typedef std::unique_ptr<B, Deleter<B> > BPtr;
- Deleter<B> del(5);
- testMoveConvertExplicit<APtr, BPtr>(std::move(del));
- del.set_state(5);
- testMoveConvertImplicit<APtr, BPtr>(std::move(del));
+ {
+ Deleter<B> 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<B> 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<A, NCDeleter<A>& > APtr;
typedef std::unique_ptr<B, NCDeleter<A>& > BPtr;
NCDeleter<A> del(5);
- testMoveConvertExplicit<APtr, BPtr>(del);
- testMoveConvertImplicit<APtr, BPtr>(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<A, CDeleter<A> > APtr;
typedef std::unique_ptr<B, CDeleter<B>& > BPtr;
CDeleter<B> del(5);
- testMoveConvertImplicit<APtr, BPtr>(del);
- testMoveConvertExplicit<APtr, BPtr>(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();
}
}
Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp?rev=245512&r1=245511&r2=245512&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp (original)
+++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer_deleter04.fail.cpp Wed Aug 19 17:35:07 2015
@@ -7,49 +7,24 @@
//
//===----------------------------------------------------------------------===//
+// Without rvalue references it is impossible to detect when a rvalue deleter
+// is given.
+// XFAIL: c++98, c++03
+
// <memory>
// unique_ptr
-// Test unique_ptr(pointer) ctor
-
-#include <memory>
-#include <cassert>
-
// unique_ptr<T, const D&>(pointer, D()) should not compile
-struct A
-{
- static int count;
- A() {++count;}
- A(const A&) {++count;}
- ~A() {--count;}
-};
-
-int A::count = 0;
-
-class Deleter
-{
- int state_;
-
-public:
-
- Deleter() : state_(5) {}
-
- int state() const {return state_;}
- void set_state(int s) {state_ = s;}
+#include <memory>
- 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<A, const Deleter&> s(p, Deleter());
- assert(s.get() == p);
- assert(s.get_deleter().state() == 5);
- }
- assert(A::count == 0);
+ // expected-error at memory:* {{static_assert failed "rvalue deleter bound to reference"}}
+ std::unique_ptr<int, const Deleter&> s((int*)nullptr, Deleter()); // expected-note {{requested here}}
}
More information about the cfe-commits
mailing list