# HG changeset patch # User lindquist # Date 1192806930 -7200 # Node ID 4d171915a77b0d4fc0b932dcb618b45a150b934c # Parent 6d60e6049c4eff1bda664a6fc0078e555dfe7f3e [svn r52] fixed static arrays in struct literals diff -r 6d60e6049c4e -r 4d171915a77b gen/arrays.c --- a/gen/arrays.c Fri Oct 19 17:00:35 2007 +0200 +++ b/gen/arrays.c Fri Oct 19 17:15:30 2007 +0200 @@ -355,6 +355,28 @@ } ////////////////////////////////////////////////////////////////////////////////////////// +void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src) +{ + assert(dst->getType() == src->getType()); + size_t arrsz = gTargetData->getTypeSize(dst->getType()->getContainedType(0)); + llvm::Value* n = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrsz, false); + + llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); + llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); + llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); + + llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32(); + std::vector llargs; + llargs.resize(4); + llargs[0] = dstarr; + llargs[1] = srcarr; + llargs[2] = n; + llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + + new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); +} + +////////////////////////////////////////////////////////////////////////////////////////// llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr) { std::vector types; diff -r 6d60e6049c4e -r 4d171915a77b gen/arrays.h --- a/gen/arrays.h Fri Oct 19 17:00:35 2007 +0200 +++ b/gen/arrays.h Fri Oct 19 17:15:30 2007 +0200 @@ -19,6 +19,7 @@ void LLVM_DtoCatArrayElement(llvm::Value* arr, Expression* exp); +void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src); llvm::Value* LLVM_DtoStaticArrayCompare(TOK op, llvm::Value* l, llvm::Value* r); #endif // LLVMC_GEN_ARRAYS_H diff -r 6d60e6049c4e -r 4d171915a77b gen/toir.c --- a/gen/toir.c Fri Oct 19 17:00:35 2007 +0200 +++ b/gen/toir.c Fri Oct 19 17:15:30 2007 +0200 @@ -1517,6 +1517,9 @@ else if (vxtype->ty == Tarray) { LLVM_DtoArrayAssign(arrptr,val); } + else if (vxtype->ty == Tsarray) { + LLVM_DtoStaticArrayCopy(arrptr,val); + } else new llvm::StoreInst(val, arrptr, p->scopebb()); } diff -r 6d60e6049c4e -r 4d171915a77b test/bug18.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bug18.d Fri Oct 19 17:15:30 2007 +0200 @@ -0,0 +1,11 @@ +module bug18; + +struct S { + int[9] i; +} + +void main() +{ + int[9] i; + auto s = S(i); +}