summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2013-11-09 04:58:13 +0000
committerChandler Carruth <chandlerc@gmail.com>2013-11-09 04:58:13 +0000
commitc197a3ab4d1498198bc190216bce41ee3887ad3a (patch)
treed9e131720eb36ffce6bd535b8b513ac4177dfcd6
parent8caea7237a8caf081d52f18b2725839bcfed84a4 (diff)
downloadexternal_llvm-c197a3ab4d1498198bc190216bce41ee3887ad3a.zip
external_llvm-c197a3ab4d1498198bc190216bce41ee3887ad3a.tar.gz
external_llvm-c197a3ab4d1498198bc190216bce41ee3887ad3a.tar.bz2
Test the polymorphic behavior of this utility.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194320 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--unittests/ADT/polymorphic_ptr_test.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/unittests/ADT/polymorphic_ptr_test.cpp b/unittests/ADT/polymorphic_ptr_test.cpp
index ce001d1..d9a2c3f 100644
--- a/unittests/ADT/polymorphic_ptr_test.cpp
+++ b/unittests/ADT/polymorphic_ptr_test.cpp
@@ -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());
+}
+
}