# HG changeset patch # User ChristianK # Date 1210619313 -7200 # Node ID ba47ac346ddd29e06ec2aa65feed3b653b2d589e # Parent 17dc52256c5896817d5fc07ddb8c0bbefabdbfd5 [svn r215] fix for empty class vtbl diff -r 17dc52256c58 -r ba47ac346ddd gen/classes.cpp --- 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(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(cd->ir.irStruct->constVtbl); + if(constVtblArray) { + vtblsz = constVtblArray->getType()->getNumElements(); + } c = DtoConstSlice(DtoConstSize_t(vtblsz), c); } inits.push_back(c); diff -r 17dc52256c58 -r ba47ac346ddd ir/irstruct.h --- 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