mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-26 08:33:14 +01:00
[svn r52] fixed static arrays in struct literals
This commit is contained in:
22
gen/arrays.c
22
gen/arrays.c
@@ -354,6 +354,28 @@ void LLVM_DtoArrayCopy(elem* dst, elem* src)
|
||||
new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
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<llvm::Value*> 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)
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ void LLVM_DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz);
|
||||
|
||||
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
|
||||
|
||||
@@ -1517,6 +1517,9 @@ elem* StructLiteralExp::toElem(IRState* p)
|
||||
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());
|
||||
}
|
||||
|
||||
11
test/bug18.d
Normal file
11
test/bug18.d
Normal file
@@ -0,0 +1,11 @@
|
||||
module bug18;
|
||||
|
||||
struct S {
|
||||
int[9] i;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int[9] i;
|
||||
auto s = S(i);
|
||||
}
|
||||
Reference in New Issue
Block a user