Test the polymorphic behavior of this utility.
authorChandler Carruth <chandlerc@gmail.com>
Sat, 9 Nov 2013 04:58:13 +0000 (04:58 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 9 Nov 2013 04:58:13 +0000 (04:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194320 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/ADT/polymorphic_ptr_test.cpp

index ce001d1e309318db0abd49a8410185e802bcb3cc..d9a2c3fdd111d81f2596e41296c598674ef7712e 100644 (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());
+}
+
 }