//===- llvm/unittest/VMCore/DerivedTypesTest.cpp - Types unit tests -------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "gtest/gtest.h" #include "../lib/VMCore/LLVMContextImpl.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; // 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(2u, pImpl->OpaqueTypes.size()); } EXPECT_EQ(1u, pImpl->OpaqueTypes.size()); PR7658(); } } // namespace