blob: c248b04ed5a2c505e5e94689eea1754877c3fc85 [file] [log] [blame]
Manuel Klimek31becd72012-01-31 19:58:34 +00001//===- unittest/ADT/IntrusiveRefCntPtrTest.cpp ----------------------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Manuel Klimek31becd72012-01-31 19:58:34 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/ADT/IntrusiveRefCntPtr.h"
10#include "gtest/gtest.h"
11
Juergen Ributzka05c5a932013-11-19 03:08:35 +000012namespace llvm {
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000013
Justin Lebar175ab742016-12-29 19:59:26 +000014namespace {
15struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {
16 SimpleRefCounted() { ++NumInstances; }
Justin Lebar57184442017-01-04 22:49:55 +000017 SimpleRefCounted(const SimpleRefCounted &) : RefCountedBase() {
18 ++NumInstances;
19 }
Justin Lebar175ab742016-12-29 19:59:26 +000020 ~SimpleRefCounted() { --NumInstances; }
Manuel Klimek31becd72012-01-31 19:58:34 +000021
Justin Lebar175ab742016-12-29 19:59:26 +000022 static int NumInstances;
23};
24int SimpleRefCounted::NumInstances = 0;
25} // anonymous namespace
Manuel Klimek31becd72012-01-31 19:58:34 +000026
Manuel Klimek31becd72012-01-31 19:58:34 +000027TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) {
Justin Lebar175ab742016-12-29 19:59:26 +000028 EXPECT_EQ(0, SimpleRefCounted::NumInstances);
29 {
30 SimpleRefCounted *S1 = new SimpleRefCounted;
31 IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1;
32 SimpleRefCounted *S2 = new SimpleRefCounted(*S1);
33 IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2;
34 EXPECT_EQ(2, SimpleRefCounted::NumInstances);
35 }
36 EXPECT_EQ(0, SimpleRefCounted::NumInstances);
Manuel Klimek31becd72012-01-31 19:58:34 +000037}
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