X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FVMCore%2FDerivedTypesTest.cpp;h=956215726cd9c7c3b13a522c33a3f650bf48cb9f;hb=f202c43de1975cd2ecc343819834275213881131;hp=11b4dffb5f471ff6aedbc2c9e427ca6c86b72248;hpb=ad715f86c90b06cc4ab9e1336d1bc3bf13ecb16d;p=oota-llvm.git diff --git a/unittests/VMCore/DerivedTypesTest.cpp b/unittests/VMCore/DerivedTypesTest.cpp index 11b4dffb5f4..956215726cd 100644 --- a/unittests/VMCore/DerivedTypesTest.cpp +++ b/unittests/VMCore/DerivedTypesTest.cpp @@ -9,23 +9,80 @@ #include "gtest/gtest.h" #include "../lib/VMCore/LLVMContextImpl.h" -#include "llvm/Type.h" #include "llvm/DerivedTypes.h" #include "llvm/LLVMContext.h" +#include "llvm/Constants.h" +#include "llvm/Support/ValueHandle.h" using namespace llvm; namespace { +static void PR7658() { + LLVMContext ctx; + + WeakVH NullPtr; + PATypeHolder h1; + { + OpaqueType *o1 = OpaqueType::get(ctx); + PointerType *p1 = PointerType::get(o1, 0); + + std::vector t1; + t1.push_back(IntegerType::get(ctx, 32)); + t1.push_back(p1); + NullPtr = ConstantPointerNull::get(p1); + OpaqueType *o2 = OpaqueType::get (ctx); + PointerType *p2 = PointerType::get (o2, 0); + t1.push_back(p2); + + + StructType *s1 = StructType::get(ctx, t1); + h1 = s1; + o1->refineAbstractTypeTo(s1); + o2->refineAbstractTypeTo(h1.get()); // h1 = { i32, \2*, \2* } + } + + + OpaqueType *o3 = OpaqueType::get(ctx); + PointerType *p3 = PointerType::get(o3, 0); // p3 = opaque* + + std::vector t2; + t2.push_back(IntegerType::get(ctx, 32)); + t2.push_back(p3); + + std::vector v2; + v2.push_back(ConstantInt::get(IntegerType::get(ctx, 32), 14)); + v2.push_back(ConstantPointerNull::get(p3)); + + OpaqueType *o4 = OpaqueType::get(ctx); + { + PointerType *p4 = PointerType::get(o4, 0); + t2.push_back(p4); + v2.push_back(ConstantPointerNull::get(p4)); + } + + WeakVH CS = ConstantStruct::get(ctx, v2, false); // { i32 14, opaque* null, opaque* null} + + StructType *s2 = StructType::get(ctx, t2); + PATypeHolder h2(s2); + o3->refineAbstractTypeTo(s2); + o4->refineAbstractTypeTo(h2.get()); +} + + TEST(OpaqueTypeTest, RegisterWithContext) { LLVMContext C; - LLVMContextImpl *pImpl = C.pImpl; + LLVMContextImpl *pImpl = C.pImpl; - EXPECT_EQ(0u, pImpl->OpaqueTypes.size()); + // 1 refers to the AlwaysOpaqueTy allocated in the Context's constructor and + // destroyed in the destructor. + EXPECT_EQ(1u, pImpl->OpaqueTypes.size()); { PATypeHolder Type = OpaqueType::get(C); - EXPECT_EQ(1u, pImpl->OpaqueTypes.size()); + EXPECT_EQ(2u, pImpl->OpaqueTypes.size()); } - EXPECT_EQ(0u, pImpl->OpaqueTypes.size()); + EXPECT_EQ(1u, pImpl->OpaqueTypes.size()); + + PR7658(); } } // namespace