Revert r194865 and r194874.
[oota-llvm.git] / unittests / ADT / IntrusiveRefCntPtrTest.cpp
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 llvm {
14
15 struct VirtualRefCounted : public RefCountedBaseVPTR {
16   virtual void f() {}
17 };
18
19 // Run this test with valgrind to detect memory leaks.
20 TEST(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
27 struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {};
28
29 // Run this test with valgrind to detect memory leaks.
30 TEST(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
37 struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
38   InterceptRefCounted(bool *Released, bool *Retained)
39     : Released(Released), Retained(Retained) {}
40   bool * const Released;
41   bool * const Retained;
42 };
43 template <> 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 };
53 TEST(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