changeset 199:ba47ac346ddd trunk

[svn r215] fix for empty class vtbl
author ChristianK
date Mon, 12 May 2008 21:08:33 +0200
parents 17dc52256c58
children e937752e4541
files gen/classes.cpp ir/irstruct.h
diffstat 2 files changed, 13 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Mon May 12 20:28:44 2008 +0200
+++ b/gen/classes.cpp	Mon May 12 21:08:33 2008 +0200
@@ -142,10 +142,12 @@
     // add base class data fields first
     LLVM_AddBaseClassData(&cd->baseclasses);
 
-    // then add own members
-    for (int k=0; k < cd->members->dim; k++) {
-        Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
-        dsym->toObjFile();
+    // then add own members, if any
+    if(cd->members) {
+        for (int k=0; k < cd->members->dim; k++) {
+            Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
+            dsym->toObjFile();
+        }
     }
 
     // resolve class data fields (possibly unions)
@@ -594,8 +596,7 @@
         }
     #if OPAQUE_VTBLS
         const llvm::ArrayType* svtbl_ty = isaArray(ts->ir.vtblType->get());
-        llvm::Constant* cvtblInit = llvm::ConstantArray::get(svtbl_ty, sinits);
-        cd->ir.irStruct->constVtbl = llvm::cast<llvm::ConstantArray>(cvtblInit);
+        cd->ir.irStruct->constVtbl = llvm::ConstantArray::get(svtbl_ty, sinits);
     #else
         const llvm::StructType* svtbl_ty = isaStruct(ts->ir.vtblType->get());
         llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits);
@@ -1495,7 +1496,11 @@
         assert(!cd->ir.irStruct->vtbl->getType()->isAbstract());
         c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->vtbl, byteptrptrty);
         assert(!cd->ir.irStruct->constVtbl->getType()->isAbstract());
-        size_t vtblsz = cd->ir.irStruct->constVtbl->getType()->getNumElements();
+        size_t vtblsz = 0;
+        llvm::ConstantArray* constVtblArray = llvm::dyn_cast<llvm::ConstantArray>(cd->ir.irStruct->constVtbl);
+        if(constVtblArray) {
+            vtblsz = constVtblArray->getType()->getNumElements();
+        }
         c = DtoConstSlice(DtoConstSize_t(vtblsz), c);
     }
     inits.push_back(c);
--- a/ir/irstruct.h	Mon May 12 20:28:44 2008 +0200
+++ b/ir/irstruct.h	Mon May 12 21:08:33 2008 +0200
@@ -77,7 +77,7 @@
 
     llvm::GlobalVariable* vtbl;
 #if OPAQUE_VTBLS
-    llvm::ConstantArray* constVtbl;
+    llvm::Constant* constVtbl;
 #else
     llvm::ConstantStruct* constVtbl;
 #endif