Mercurial > hg > CbC > CbC_llvm
comparison unittests/ADT/IntrusiveRefCntPtrTest.cpp @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 803732b1fca8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
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 { | |
15 virtual void f() {} | |
16 }; | |
17 } | |
18 | |
19 namespace llvm { | |
20 | |
21 // Run this test with valgrind to detect memory leaks. | |
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. | |
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> { | |
40 InterceptRefCounted(bool *Released, bool *Retained) | |
41 : Released(Released), Retained(Retained) {} | |
42 bool * const Released; | |
43 bool * const Retained; | |
44 }; | |
45 template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> { | |
46 static void retain(InterceptRefCounted *I) { | |
47 *I->Retained = true; | |
48 I->Retain(); | |
49 } | |
50 static void release(InterceptRefCounted *I) { | |
51 *I->Released = true; | |
52 I->Release(); | |
53 } | |
54 }; | |
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 |