[svn r26] * Fixed templates defining a constant value

* Fixed problem with slice-slice copy assignment if a side was a temporary slice
This commit is contained in:
Tomas Lindquist Olsen
2007-10-04 07:35:02 +02:00
parent 879d2f10be
commit 0ba16ebb39
5 changed files with 40 additions and 4 deletions

View File

@@ -308,7 +308,21 @@ static llvm::Value* get_slice_ptr(elem* e, llvm::Value*& sz)
assert(e->mem);
const llvm::Type* t = e->mem->getType()->getContainedType(0);
llvm::Value* ret = 0;
if (llvm::isa<llvm::ArrayType>(t)) {
if (e->arg != 0) {
// this means it's a real slice
ret = e->mem;
size_t elembsz = gTargetData->getTypeSize(ret->getType());
llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false);
if (llvm::isa<llvm::ConstantInt>(e->arg)) {
sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e->arg));
}
else {
sz = llvm::BinaryOperator::createMul(elemsz,e->arg,"tmp",gIR->scopebb());
}
}
else if (llvm::isa<llvm::ArrayType>(t)) {
ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb());
size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0));

View File

@@ -497,7 +497,7 @@ void VarDeclaration::toObjFile()
}
// global variable or magic
if (!parent || parent->isModule())
if (isDataseg())
{
bool _isconst = isConst();
if (!_isconst)