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 {
14struct VirtualRefCounted : public llvm::RefCountedBaseVPTR {
15  virtual void f() {}
16};
17}
18
19namespace llvm {
20
21// Run this test with valgrind to detect memory leaks.
22TEST(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
29struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {};
30
31// Run this test with valgrind to detect memory leaks.
32TEST(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
39struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
40  InterceptRefCounted(bool *Released, bool *Retained)
41    : Released(Released), Retained(Retained) {}
42  bool * const Released;
43  bool * const Retained;
44};
45template <> 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};
55TEST(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