llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp
Juergen Ributzka ba0f991a78 [weak vtables] Place class definitions into anonymous namespaces to prevent weak vtables.
This patch places class definitions in implementation files into anonymous
namespaces to prevent weak vtables. This eliminates the need of providing an
out-of-line definition to pin the vtable explicitly to the file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195092 91177308-0d34-0410-b5e6-96231b3b80d8
2013-11-19 03:08:35 +00:00

67 lines
2.0 KiB
C++

//===- unittest/ADT/IntrusiveRefCntPtrTest.cpp ----------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "gtest/gtest.h"
namespace {
struct VirtualRefCounted : public llvm::RefCountedBaseVPTR {
virtual void f() {}
};
}
namespace llvm {
// Run this test with valgrind to detect memory leaks.
TEST(IntrusiveRefCntPtr, RefCountedBaseVPTRCopyDoesNotLeak) {
VirtualRefCounted *V1 = new VirtualRefCounted;
IntrusiveRefCntPtr<VirtualRefCounted> R1 = V1;
VirtualRefCounted *V2 = new VirtualRefCounted(*V1);
IntrusiveRefCntPtr<VirtualRefCounted> R2 = V2;
}
struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {};
// Run this test with valgrind to detect memory leaks.
TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) {
SimpleRefCounted *S1 = new SimpleRefCounted;
IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1;
SimpleRefCounted *S2 = new SimpleRefCounted(*S1);
IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2;
}
struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
InterceptRefCounted(bool *Released, bool *Retained)
: Released(Released), Retained(Retained) {}
bool * const Released;
bool * const Retained;
};
template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> {
static void retain(InterceptRefCounted *I) {
*I->Retained = true;
I->Retain();
}
static void release(InterceptRefCounted *I) {
*I->Released = true;
I->Release();
}
};
TEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) {
bool Released = false;
bool Retained = false;
{
InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained);
IntrusiveRefCntPtr<InterceptRefCounted> R = I;
}
EXPECT_TRUE(Released);
EXPECT_TRUE(Retained);
}
} // end namespace llvm