1*9880d681SAndroid Build Coastguard Worker //===- unittest/ADT/IntrusiveRefCntPtrTest.cpp ----------------------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/IntrusiveRefCntPtr.h" 11*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h" 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker namespace { 14*9880d681SAndroid Build Coastguard Worker struct VirtualRefCounted : public llvm::RefCountedBaseVPTR { f__anone26132ad0111::VirtualRefCounted15*9880d681SAndroid Build Coastguard Worker virtual void f() {} 16*9880d681SAndroid Build Coastguard Worker }; 17*9880d681SAndroid Build Coastguard Worker } 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker namespace llvm { 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker // Run this test with valgrind to detect memory leaks. TEST(IntrusiveRefCntPtr,RefCountedBaseVPTRCopyDoesNotLeak)22*9880d681SAndroid Build Coastguard WorkerTEST(IntrusiveRefCntPtr, RefCountedBaseVPTRCopyDoesNotLeak) { 23*9880d681SAndroid Build Coastguard Worker VirtualRefCounted *V1 = new VirtualRefCounted; 24*9880d681SAndroid Build Coastguard Worker IntrusiveRefCntPtr<VirtualRefCounted> R1 = V1; 25*9880d681SAndroid Build Coastguard Worker VirtualRefCounted *V2 = new VirtualRefCounted(*V1); 26*9880d681SAndroid Build Coastguard Worker IntrusiveRefCntPtr<VirtualRefCounted> R2 = V2; 27*9880d681SAndroid Build Coastguard Worker } 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {}; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker // Run this test with valgrind to detect memory leaks. TEST(IntrusiveRefCntPtr,RefCountedBaseCopyDoesNotLeak)32*9880d681SAndroid Build Coastguard WorkerTEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) { 33*9880d681SAndroid Build Coastguard Worker SimpleRefCounted *S1 = new SimpleRefCounted; 34*9880d681SAndroid Build Coastguard Worker IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1; 35*9880d681SAndroid Build Coastguard Worker SimpleRefCounted *S2 = new SimpleRefCounted(*S1); 36*9880d681SAndroid Build Coastguard Worker IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2; 37*9880d681SAndroid Build Coastguard Worker } 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> { InterceptRefCountedllvm::InterceptRefCounted40*9880d681SAndroid Build Coastguard Worker InterceptRefCounted(bool *Released, bool *Retained) 41*9880d681SAndroid Build Coastguard Worker : Released(Released), Retained(Retained) {} 42*9880d681SAndroid Build Coastguard Worker bool * const Released; 43*9880d681SAndroid Build Coastguard Worker bool * const Retained; 44*9880d681SAndroid Build Coastguard Worker }; 45*9880d681SAndroid Build Coastguard Worker template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> { retainllvm::IntrusiveRefCntPtrInfo46*9880d681SAndroid Build Coastguard Worker static void retain(InterceptRefCounted *I) { 47*9880d681SAndroid Build Coastguard Worker *I->Retained = true; 48*9880d681SAndroid Build Coastguard Worker I->Retain(); 49*9880d681SAndroid Build Coastguard Worker } releasellvm::IntrusiveRefCntPtrInfo50*9880d681SAndroid Build Coastguard Worker static void release(InterceptRefCounted *I) { 51*9880d681SAndroid Build Coastguard Worker *I->Released = true; 52*9880d681SAndroid Build Coastguard Worker I->Release(); 53*9880d681SAndroid Build Coastguard Worker } 54*9880d681SAndroid Build Coastguard Worker }; TEST(IntrusiveRefCntPtr,UsesTraitsToRetainAndRelease)55*9880d681SAndroid Build Coastguard WorkerTEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) { 56*9880d681SAndroid Build Coastguard Worker bool Released = false; 57*9880d681SAndroid Build Coastguard Worker bool Retained = false; 58*9880d681SAndroid Build Coastguard Worker { 59*9880d681SAndroid Build Coastguard Worker InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained); 60*9880d681SAndroid Build Coastguard Worker IntrusiveRefCntPtr<InterceptRefCounted> R = I; 61*9880d681SAndroid Build Coastguard Worker } 62*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Released); 63*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Retained); 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 67