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 
13 namespace {
14 struct VirtualRefCounted : public llvm::RefCountedBaseVPTR {
f__anon98ed42f70111::VirtualRefCounted15   virtual void f() {}
16 };
17 }
18 
19 namespace llvm {
20 
21 // Run this test with valgrind to detect memory leaks.
TEST(IntrusiveRefCntPtr,RefCountedBaseVPTRCopyDoesNotLeak)22 TEST(IntrusiveRefCntPtr, RefCountedBaseVPTRCopyDoesNotLeak) {
23   VirtualRefCounted *V1 = new VirtualRefCounted;
24   IntrusiveRefCntPtr<VirtualRefCounted> R1 = V1;
25   VirtualRefCounted *V2 = new VirtualRefCounted(*V1);
26   IntrusiveRefCntPtr<VirtualRefCounted> R2 = V2;
27 }
28 
29 struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {};
30 
31 // Run this test with valgrind to detect memory leaks.
TEST(IntrusiveRefCntPtr,RefCountedBaseCopyDoesNotLeak)32 TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) {
33   SimpleRefCounted *S1 = new SimpleRefCounted;
34   IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1;
35   SimpleRefCounted *S2 = new SimpleRefCounted(*S1);
36   IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2;
37 }
38 
39 struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
InterceptRefCountedllvm::InterceptRefCounted40   InterceptRefCounted(bool *Released, bool *Retained)
41     : Released(Released), Retained(Retained) {}
42   bool * const Released;
43   bool * const Retained;
44 };
45 template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> {
retainllvm::IntrusiveRefCntPtrInfo46   static void retain(InterceptRefCounted *I) {
47     *I->Retained = true;
48     I->Retain();
49   }
releasellvm::IntrusiveRefCntPtrInfo50   static void release(InterceptRefCounted *I) {
51     *I->Released = true;
52     I->Release();
53   }
54 };
TEST(IntrusiveRefCntPtr,UsesTraitsToRetainAndRelease)55 TEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) {
56   bool Released = false;
57   bool Retained = false;
58   {
59     InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained);
60     IntrusiveRefCntPtr<InterceptRefCounted> R = I;
61   }
62   EXPECT_TRUE(Released);
63   EXPECT_TRUE(Retained);
64 }
65 
66 } // end namespace llvm
67