unit test to go along with r108610
authorChris Lattner <sabre@nondot.org>
Sat, 17 Jul 2010 06:14:03 +0000 (06:14 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 17 Jul 2010 06:14:03 +0000 (06:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108611 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/VMCore/DerivedTypesTest.cpp

index 2e0450d6e5cec4fc29d52765f58facae9a9f3c8f..9dea6ff2a904d675324321566d1dacc8b7d99a67 100644 (file)
@@ -9,13 +9,66 @@
 
 #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<const Type *> 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<const Type *> t2;
+  t2.push_back(IntegerType::get(ctx, 32));
+  t2.push_back(p3);
+  
+  std::vector<Constant *> 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;
@@ -28,6 +81,8 @@ TEST(OpaqueTypeTest, RegisterWithContext) {
     EXPECT_EQ(2u, pImpl->OpaqueTypes.size());
   }
   EXPECT_EQ(1u, pImpl->OpaqueTypes.size());
+  
+  PR7658();
 }
 
 }  // namespace