Test the polymorphic behavior of this utility.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194320 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2013-11-09 04:58:13 +00:00
parent 8caea7237a
commit c197a3ab4d

View File

@ -22,7 +22,8 @@ struct S {
};
// A function that forces the return of a copy.
polymorphic_ptr<S> dummy_copy(const polymorphic_ptr<S> &arg) { return arg; }
template <typename T>
T dummy_copy(const T &arg) { return arg; }
TEST(polymorphic_ptr_test, Basic) {
polymorphic_ptr<S> null;
@ -83,4 +84,35 @@ TEST(polymorphic_ptr_test, Basic) {
EXPECT_EQ(42, p3->x);
}
struct Base {
virtual ~Base() {}
virtual Base *clone() = 0;
virtual StringRef name() { return "Base"; }
};
struct DerivedA : Base {
virtual DerivedA *clone() { return new DerivedA(); }
virtual StringRef name() { return "DerivedA"; }
};
struct DerivedB : Base {
virtual DerivedB *clone() { return new DerivedB(); }
virtual StringRef name() { return "DerivedB"; }
};
TEST(polymorphic_ptr_test, Polymorphism) {
polymorphic_ptr<Base> a(new DerivedA());
polymorphic_ptr<Base> b(new DerivedB());
EXPECT_EQ("DerivedA", a->name());
EXPECT_EQ("DerivedB", b->name());
polymorphic_ptr<Base> copy = dummy_copy(a);
EXPECT_NE(a, copy);
EXPECT_EQ("DerivedA", copy->name());
copy = dummy_copy(b);
EXPECT_NE(b, copy);
EXPECT_EQ("DerivedB", copy->name());
}
}