blob: 83dc137664977a90fc5747c09a31e8bccdbdb150 [file] [log] [blame]
Manuel Klimek41aa1082012-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 Ributzkaba0f9912013-11-19 03:08:35 +000013namespace llvm {
Juergen Ributzka35436252013-11-19 00:57:56 +000014
Justin Lebar517714c2016-12-29 19:59:26 +000015namespace {
16struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {
17 SimpleRefCounted() { ++NumInstances; }
Justin Lebard5845b62017-01-04 22:49:55 +000018 SimpleRefCounted(const SimpleRefCounted &) : RefCountedBase() {
19 ++NumInstances;
20 }
Justin Lebar517714c2016-12-29 19:59:26 +000021 ~SimpleRefCounted() { --NumInstances; }
Manuel Klimek41aa1082012-01-31 19:58:34 +000022
Justin Lebar517714c2016-12-29 19:59:26 +000023 static int NumInstances;
24};
25int SimpleRefCounted::NumInstances = 0;
26} // anonymous namespace
Manuel Klimek41aa1082012-01-31 19:58:34 +000027
Manuel Klimek41aa1082012-01-31 19:58:34 +000028TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) {
Justin Lebar517714c2016-12-29 19:59:26 +000029 EXPECT_EQ(0, SimpleRefCounted::NumInstances);
30 {
31 SimpleRefCounted *S1 = new SimpleRefCounted;
32 IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1;
33 SimpleRefCounted *S2 = new SimpleRefCounted(*S1);
34 IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2;
35 EXPECT_EQ(2, SimpleRefCounted::NumInstances);
36 }
37 EXPECT_EQ(0, SimpleRefCounted::NumInstances);
Manuel Klimek41aa1082012-01-31 19:58:34 +000038}
39
40struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
41 InterceptRefCounted(bool *Released, bool *Retained)
42 : Released(Released), Retained(Retained) {}
43 bool * const Released;
44 bool * const Retained;
45};
46template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> {
47 static void retain(InterceptRefCounted *I) {
48 *I->Retained = true;
49 I->Retain();
50 }
51 static void release(InterceptRefCounted *I) {
52 *I->Released = true;
53 I->Release();
54 }
55};
56TEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) {
57 bool Released = false;
58 bool Retained = false;
59 {
60 InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained);
61 IntrusiveRefCntPtr<InterceptRefCounted> R = I;
62 }
63 EXPECT_TRUE(Released);
64 EXPECT_TRUE(Retained);
65}
66
67} // end namespace llvm