blob: c67ec130912de43cf67cf35c0d551e27af10fec6 [file] [log] [blame]
Manuel Klimek31becd72012-01-31 19:58:34 +00001//===- 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
Juergen Ributzka05c5a932013-11-19 03:08:35 +000013namespace {
14struct VirtualRefCounted : public llvm::RefCountedBaseVPTR {
15 virtual void f() {}
Manuel Klimek31becd72012-01-31 19:58:34 +000016};
Juergen Ributzka05c5a932013-11-19 03:08:35 +000017}
Manuel Klimek31becd72012-01-31 19:58:34 +000018
Juergen Ributzka05c5a932013-11-19 03:08:35 +000019namespace llvm {
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000020
Manuel Klimek31becd72012-01-31 19:58:34 +000021// 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