From 94e4a5b5a165eda7fa5402d450d5926ac97d786b Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 12 May 2008 21:08:33 +0200 Subject: [PATCH] [svn r215] fix for empty class vtbl --- gen/classes.cpp | 19 ++++++++++++------- ir/irstruct.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/gen/classes.cpp b/gen/classes.cpp index 6fe8e923..c01906e1 100644 --- a/gen/classes.cpp +++ b/gen/classes.cpp @@ -142,10 +142,12 @@ void DtoResolveClass(ClassDeclaration* cd) // 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 @@ void DtoConstInitClass(ClassDeclaration* cd) } #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(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 @@ void DtoDefineClassInfo(ClassDeclaration* cd) 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(cd->ir.irStruct->constVtbl); + if(constVtblArray) { + vtblsz = constVtblArray->getType()->getNumElements(); + } c = DtoConstSlice(DtoConstSize_t(vtblsz), c); } inits.push_back(c); diff --git a/ir/irstruct.h b/ir/irstruct.h index 9402b107..1b833c8e 100644 --- a/ir/irstruct.h +++ b/ir/irstruct.h @@ -77,7 +77,7 @@ public: llvm::GlobalVariable* vtbl; #if OPAQUE_VTBLS - llvm::ConstantArray* constVtbl; + llvm::Constant* constVtbl; #else llvm::ConstantStruct* constVtbl; #endif