From 0ba16ebb3944a789d363aeea133bc3ea0db9d4ca Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Thu, 4 Oct 2007 07:35:02 +0200 Subject: [PATCH] [svn r26] * Fixed templates defining a constant value * Fixed problem with slice-slice copy assignment if a side was a temporary slice --- gen/arrays.c | 16 +++++++++++++++- gen/toobj.c | 2 +- lphobos/std/stdio.d | 6 ++++-- test/globals2.d | 12 ++++++++++++ test/stdiotest.d | 8 ++++++++ 5 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 test/globals2.d create mode 100644 test/stdiotest.d diff --git a/gen/arrays.c b/gen/arrays.c index 66ab26e5..042a6f80 100644 --- a/gen/arrays.c +++ b/gen/arrays.c @@ -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(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(e->arg)) { + sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast(e->arg)); + } + else { + sz = llvm::BinaryOperator::createMul(elemsz,e->arg,"tmp",gIR->scopebb()); + } + } + else if (llvm::isa(t)) { ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb()); size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); diff --git a/gen/toobj.c b/gen/toobj.c index 8de3330e..b9c72979 100644 --- a/gen/toobj.c +++ b/gen/toobj.c @@ -497,7 +497,7 @@ void VarDeclaration::toObjFile() } // global variable or magic - if (!parent || parent->isModule()) + if (isDataseg()) { bool _isconst = isConst(); if (!_isconst) diff --git a/lphobos/std/stdio.d b/lphobos/std/stdio.d index 6f215002..2e3ddfb0 100644 --- a/lphobos/std/stdio.d +++ b/lphobos/std/stdio.d @@ -1,13 +1,15 @@ module std.stdio; +import std.traits; + void _writef(T)(T t) { static if(is(T: Object)) _writef(t.toString()); else - static if(is(T==char)) _writef("%c", t); else + static if(is(T==char)) printf("%c", t); else static if(is(T: char[])) printf("%.*s", t.length, t.ptr); else static if(isArray!(T)) { _writef('['); if (t.length) _writef(t[0]); - for (int i=1; i