diff options
| author | Manuel Klimek <klimek@google.com> | 2012-01-31 19:58:34 +0000 |
|---|---|---|
| committer | Manuel Klimek <klimek@google.com> | 2012-01-31 19:58:34 +0000 |
| commit | 31becd7c88028f07645be49b69f653130e78de1b (patch) | |
| tree | edfea435d533f16fb458ca5172367c699b6ae5a1 /llvm/unittests | |
| parent | 1f1daa9ac77a1e193e53b70d56bc174068a4beb1 (diff) | |
| download | bcm5719-llvm-31becd7c88028f07645be49b69f653130e78de1b.tar.gz bcm5719-llvm-31becd7c88028f07645be49b69f653130e78de1b.zip | |
RefCountedBaseVPTR needs the IntrusiveRefCntPtrInfo as friend,
now that this handles the release / retain calls.
Adds a regression test for that bug (which is a compile-time
regression) and for the last two changes to the IntrusiveRefCntPtr,
especially tests for the memory leak due to copy construction of the
ref-counted object and ensuring that the traits are used for release /
retain calls.
llvm-svn: 149411
Diffstat (limited to 'llvm/unittests')
| -rw-r--r-- | llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp | 64 | ||||
| -rw-r--r-- | llvm/unittests/CMakeLists.txt | 1 |
2 files changed, 65 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp new file mode 100644 index 00000000000..0c8c4ca16dd --- /dev/null +++ b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp @@ -0,0 +1,64 @@ +//===- 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 llvm { + +struct VirtualRefCounted : public RefCountedBaseVPTR { + virtual void f() {} +}; + +// 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 diff --git a/llvm/unittests/CMakeLists.txt b/llvm/unittests/CMakeLists.txt index 6724f2df83f..977efd790b7 100644 --- a/llvm/unittests/CMakeLists.txt +++ b/llvm/unittests/CMakeLists.txt @@ -64,6 +64,7 @@ add_llvm_unittest(ADT ADT/ImmutableSetTest.cpp ADT/IntEqClassesTest.cpp ADT/IntervalMapTest.cpp + ADT/IntrusiveRefCntPtrTest.cpp ADT/PackedVectorTest.cpp ADT/SmallBitVectorTest.cpp ADT/SmallStringTest.cpp |

