[libcxx] [NFC] Add more reinterpret_pointer_cast tests.
authorzoecarver <z.zoelec2@gmail.com>
Thu, 14 May 2020 19:01:55 +0000 (12:01 -0700)
committerzoecarver <z.zoelec2@gmail.com>
Thu, 14 May 2020 19:04:05 +0000 (12:04 -0700)
 * Add test for inheritance.
 * Test value is preserved through cast.

libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/reinterpret_pointer_cast.pass.cpp

index 221001f..743d60c 100644 (file)
@@ -23,6 +23,9 @@ struct A {
   int x;
 };
 
+struct Base { };
+struct Derived : public Base { };
+
 int main(int, char**) {
   {
     const std::shared_ptr<A> pA(new A);
@@ -38,6 +41,26 @@ int main(int, char**) {
     assert(pA2.get() == pA.get());
     assert(!pi.owner_before(pA) && !pA.owner_before(pi));
   }
+  {
+    const std::shared_ptr<A> pA(new A);
+    std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA);
+    pA->x = 42;
+    assert(*pi == 42);
+  }
+  {
+    const std::shared_ptr<Derived> pDerived(new Derived);
+    std::shared_ptr<Base> pBase = std::reinterpret_pointer_cast<Base>(pDerived);
+    std::shared_ptr<Derived> pDerived2 = std::reinterpret_pointer_cast<Derived>(pBase);
+    assert(pDerived2.get() == pDerived2.get());
+    assert(!pBase.owner_before(pDerived) && !pDerived.owner_before(pBase));
+  }
+  {
+    const std::shared_ptr<Base> pBase(new Base);
+    std::shared_ptr<Derived> pDerived = std::reinterpret_pointer_cast<Derived>(pBase);
+    std::shared_ptr<Base> pBase2 = std::reinterpret_pointer_cast<Base>(pDerived);
+    assert(pBase2.get() == pBase.get());
+    assert(!pDerived.owner_before(pBase) && !pBase.owner_before(pDerived));
+  }
 #if TEST_STD_VER > 14
   {
     const std::shared_ptr<A[8]> pA;