//===- unittest/ADT/IntrusiveRefCntPtrTest.cpp ----------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "gtest/gtest.h" namespace llvm { namespace { struct SimpleRefCounted : public RefCountedBase { SimpleRefCounted() { ++NumInstances; } SimpleRefCounted(const SimpleRefCounted &) : RefCountedBase() { ++NumInstances; } ~SimpleRefCounted() { --NumInstances; } static int NumInstances; }; int SimpleRefCounted::NumInstances = 0; } // anonymous namespace TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) { EXPECT_EQ(0, SimpleRefCounted::NumInstances); { SimpleRefCounted *S1 = new SimpleRefCounted; IntrusiveRefCntPtr R1 = S1; SimpleRefCounted *S2 = new SimpleRefCounted(*S1); IntrusiveRefCntPtr R2 = S2; EXPECT_EQ(2, SimpleRefCounted::NumInstances); } EXPECT_EQ(0, SimpleRefCounted::NumInstances); } struct InterceptRefCounted : public RefCountedBase { InterceptRefCounted(bool *Released, bool *Retained) : Released(Released), Retained(Retained) {} bool * const Released; bool * const Retained; }; template <> struct IntrusiveRefCntPtrInfo { static void retain(InterceptRefCounted *I) { *I->Retained = true; I->Retain(); } static void release(InterceptRefCounted *I) { *I->Released = true; I->Release(); } }; TEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) { bool Released = false; bool Retained = false; { InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained); IntrusiveRefCntPtr R = I; } EXPECT_TRUE(Released); EXPECT_TRUE(Retained); } } // end namespace llvm