Cleanup unique_ptr failure tests and convert them to Clang verify

llvm-svn: 245529
This commit is contained in:
Eric Fiselier 2015-08-20 01:08:03 +00:00
parent 25dd3a699c
commit 4f42dcd59b
8 changed files with 100 additions and 219 deletions

View File

@ -14,25 +14,16 @@
// Test unique_ptr move assignment // Test unique_ptr move assignment
#include <memory> #include <memory>
#include <cassert>
#include "test_macros.h"
// Can't copy from lvalue // Can't copy from lvalue
struct A
{
static int count;
A() {++count;}
A(const A&) {++count;}
~A() {--count;}
};
int A::count = 0;
int main() int main()
{ {
{ std::unique_ptr<int> s, s2;
std::unique_ptr<A> s(new A); #if TEST_STD_VER >= 11
std::unique_ptr<A> s2; s2 = s; // expected-error {{cannot be assigned because its copy assignment operator is implicitly deleted}}
s2 = s; #else
} s2 = s; // expected-error {{'operator=' is a private member}}
#endif
} }

View File

@ -14,25 +14,20 @@
// Test unique_ptr move assignment // Test unique_ptr move assignment
#include <memory> #include <memory>
#include <cassert>
#include "test_macros.h"
// Can't copy from const lvalue // Can't copy from const lvalue
struct A
{
static int count;
A() {++count;}
A(const A&) {++count;}
~A() {--count;}
};
int A::count = 0;
int main() int main()
{ {
{ const std::unique_ptr<int> s(new int);
const std::unique_ptr<A> s(new A); std::unique_ptr<int> s2;
std::unique_ptr<A> s2; #if TEST_STD_VER >= 11
s2 = s; s2 = s; // expected-error {{cannot be assigned because its copy assignment operator is implicitly deleted}}
} #else
// NOTE: The error says "constructor" because the assignment operator takes
// 's' by value and attempts to copy construct it.
s2 = s; // expected-error {{no matching constructor for initialization}}
#endif
} }

View File

@ -14,43 +14,20 @@
// Test unique_ptr move assignment // Test unique_ptr move assignment
#include <memory> #include <memory>
#include <cassert>
#include "test_macros.h"
struct Deleter {
void operator()(int* p) {delete p;}
};
// Can't copy from lvalue // Can't copy from lvalue
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 operator()(A* p) {delete p;}
};
int main() int main()
{ {
{ std::unique_ptr<int, Deleter> s, s2;
std::unique_ptr<A, Deleter> s(new A); #if TEST_STD_VER >= 11
A* p = s.get(); s2 = s; // expected-error {{cannot be assigned because its copy assignment operator is implicitly deleted}}
std::unique_ptr<A, Deleter> s2; #else
s2 = s; s2 = s; // expected-error {{'operator=' is a private member}}
assert(s2.get() == p); #endif
assert(s.get() == 0);
assert(A::count == 1);
}
assert(A::count == 0);
} }

View File

@ -11,46 +11,26 @@
// unique_ptr // unique_ptr
// Test unique_ptr move ctor // Test unique_ptr move assignment
#include <memory> #include <memory>
#include <cassert>
// test move ctor. Can't copy from const lvalue #include "test_macros.h"
struct A struct Deleter {
{ void operator()(int* p) {delete p;}
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 operator()(A* p) {delete p;}
}; };
// Can't copy from a const lvalue
int main() int main()
{ {
{ const std::unique_ptr<int, Deleter> s(new int);
const std::unique_ptr<A, Deleter> s(new A); std::unique_ptr<int, Deleter> s2;
A* p = s.get(); #if TEST_STD_VER >= 11
std::unique_ptr<A, Deleter> s2; s2 = s; // expected-error {{cannot be assigned because its copy assignment operator is implicitly deleted}}
s2 = s; #else
assert(s2.get() == p); // NOTE: The error says "constructor" because the assignment operator takes
assert(s.get() == 0); // 's' by value and attempts to copy construct it.
assert(A::count == 1); s2 = s; // expected-error {{no matching constructor for initialization}}
} #endif
assert(A::count == 0);
} }

View File

@ -14,44 +14,29 @@
// Test unique_ptr converting move assignment // Test unique_ptr converting move assignment
#include <memory> #include <memory>
#include <utility>
#include <cassert>
// Can't assign from lvalue #include "test_macros.h"
struct A struct A
{ {
static int count; A() {}
A() {++count;} virtual ~A() {}
A(const A&) {++count;}
virtual ~A() {--count;}
}; };
int A::count = 0; struct B : public A
struct B
: public A
{ {
static int count;
B() {++count;}
B(const B&) {++count;}
virtual ~B() {--count;}
}; };
int B::count = 0; // Can't assign from lvalue
int main() int main()
{ {
{ std::unique_ptr<B> s;
std::unique_ptr<B> s(new B);
A* p = s.get();
std::unique_ptr<A> s2; std::unique_ptr<A> s2;
s2 = s; #if TEST_STD_VER >= 11
assert(s2.get() == p); s2 = s; // expected-error {{no viable overloaded '='}}
assert(s.get() == 0); #else
assert(A::count == 1); // NOTE: The move-semantic emulation creates an ambiguous overload set
assert(B::count == 1); // so that assignment from an lvalue does not compile
} s2 = s; // expected-error {{use of overloaded operator '=' is ambiguous}}
assert(A::count == 0); #endif
assert(B::count == 0);
} }

View File

@ -14,48 +14,30 @@
// Test unique_ptr converting move assignment // Test unique_ptr converting move assignment
#include <memory> #include <memory>
#include <utility>
#include <cassert>
#include "test_macros.h"
#include "../../deleter.h" #include "../../deleter.h"
// Can't assign from lvalue
struct A struct A
{ {
static int count; A() {}
A() {++count;} virtual ~A() {}
A(const A&) {++count;}
virtual ~A() {--count;}
}; };
int A::count = 0; struct B : public A
struct B
: public A
{ {
static int count;
B() {++count;}
B(const B&) {++count;}
virtual ~B() {--count;}
}; };
int B::count = 0; // Can't assign from lvalue
int main() int main()
{ {
{ std::unique_ptr<B, Deleter<B> > s;
std::unique_ptr<B, Deleter<B> > s(new B);
A* p = s.get();
std::unique_ptr<A, Deleter<A> > s2; std::unique_ptr<A, Deleter<A> > s2;
s2 = s; #if TEST_STD_VER >= 11
assert(s2.get() == p); s2 = s; // expected-error {{no viable overloaded '='}}
assert(s.get() == 0); #else
assert(A::count == 1); // NOTE: The move-semantic emulation creates an ambiguous overload set
assert(B::count == 1); // so that assignment from an lvalue does not compile
assert(s2.get_deleter().state() == 5); s2 = s; // expected-error {{use of overloaded operator '=' is ambiguous}}
assert(s.get_deleter().state() == 0); #endif
}
assert(A::count == 0);
assert(B::count == 0);
} }

View File

@ -16,47 +16,32 @@
// Can't assign from lvalue // Can't assign from lvalue
#include <memory> #include <memory>
#include <utility>
#include <cassert>
#include "test_macros.h"
#include "../../deleter.h" #include "../../deleter.h"
struct A struct A
{ {
static int count; A() {}
A() {++count;} virtual ~A() {}
A(const A&) {++count;}
virtual ~A() {--count;}
}; };
int A::count = 0; struct B : public A
struct B
: public A
{ {
static int count;
B() {++count;}
B(const B&) {++count;}
virtual ~B() {--count;}
}; };
int B::count = 0; // Can't assign from lvalue
int main() int main()
{ {
{ Deleter<B> db;
Deleter<B> db(5); std::unique_ptr<B, Deleter<B>& > s(new B, db);
std::unique_ptr<B, Deleter<B>&> s(new B, db); Deleter<A> da;
A* p = s.get(); std::unique_ptr<A, Deleter<A> &> s2(new A, da);
Deleter<A> da(6); #if TEST_STD_VER >= 11
std::unique_ptr<A, Deleter<A>&> s2(new A, da); s2 = s; // expected-error {{no viable overloaded '='}}
s2 = s; #else
assert(s2.get() == p); // NOTE: The move-semantic emulation creates an ambiguous overload set
assert(s.get() == 0); // so that assignment from an lvalue does not compile
assert(A::count == 1); s2 = s; // expected-error {{use of overloaded operator '=' is ambiguous}}
assert(B::count == 1); #endif
assert(s2.get_deleter().state() == 5);
}
assert(A::count == 0);
assert(B::count == 0);
} }

View File

@ -14,44 +14,30 @@
// Test unique_ptr converting move assignment // Test unique_ptr converting move assignment
#include <memory> #include <memory>
#include <utility>
#include <cassert>
// Can't assign from const lvalue #include "test_macros.h"
#include "../../deleter.h"
struct A struct A
{ {
static int count; A() {}
A() {++count;} virtual ~A() {}
A(const A&) {++count;}
virtual ~A() {--count;}
}; };
int A::count = 0; struct B : public A
struct B
: public A
{ {
static int count;
B() {++count;}
B(const B&) {++count;}
virtual ~B() {--count;}
}; };
int B::count = 0; // Can't assign from lvalue
int main() int main()
{ {
{
const std::unique_ptr<B> s(new B); const std::unique_ptr<B> s(new B);
A* p = s.get();
std::unique_ptr<A> s2; std::unique_ptr<A> s2;
s2 = s; #if TEST_STD_VER >= 11
assert(s2.get() == p); s2 = s; // expected-error {{no viable overloaded '='}}
assert(s.get() == 0); #else
assert(A::count == 1); // NOTE: The error says "constructor" because the assignment operator takes
assert(B::count == 1); // 's' by value and attempts to copy construct it.
} s2 = s; // expected-error {{no matching constructor for initialization}}
assert(A::count == 0); #endif
assert(B::count == 0);
} }