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