forked from OSchip/llvm-project
Cleanup unique_ptr failure tests and convert them to Clang verify
llvm-svn: 245529
This commit is contained in:
parent
25dd3a699c
commit
4f42dcd59b
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue