From 67f3d8ae607856208a921d3c17d2297d5a3020bd Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Thu, 4 Oct 2007 12:49:37 +0200 Subject: [PATCH] [svn r32] * Fixed problems with arrays members of aggregates --- gen/toir.c | 14 +++++++++----- gen/toobj.c | 26 ++++++++++++++++++++------ test/bug3.d | 16 ++++++++++++++++ 3 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 test/bug3.d diff --git a/gen/toir.c b/gen/toir.c index d1cd3207..badbb3d7 100644 --- a/gen/toir.c +++ b/gen/toir.c @@ -228,12 +228,16 @@ elem* NullExp::toElem(IRState* p) LOG_SCOPE; elem* e = new elem; const llvm::Type* t = LLVM_DtoType(type); - if (llvm::isa(t)) - t = llvm::PointerType::get(t); - Logger::cout() << *t << '\n'; - e->val = llvm::Constant::getNullValue(t); + + if (type->ty == Tarray) { + assert(llvm::isa(t)); + e->val = llvm::ConstantAggregateZero::get(t); + } + else + e->val = llvm::Constant::getNullValue(t); assert(e->val); - Logger::cout() << *e->val << '\n'; + + Logger::cout() << "null value is now " << *e->val << '\n'; e->type = elem::NUL; return e; } diff --git a/gen/toobj.c b/gen/toobj.c index 772f714a..5614d9e9 100644 --- a/gen/toobj.c +++ b/gen/toobj.c @@ -574,17 +574,25 @@ void VarDeclaration::toObjFile() const llvm::Type* _type = LLVM_DtoType(type); gIR->topstruct().fields.push_back(_type); - llvm::Constant* _init = LLVM_DtoInitializer(type, init); - if (_type != _init->getType()) + llvm::Constant*_init = LLVM_DtoInitializer(type, init); + assert(_init); + Logger::cout() << "field init is: " << *_init << " type should be " << *_type << '\n'; + if (!_init || _type != _init->getType()) { - if (llvm::isa(_type)) + if (type->ty == Tsarray) { const llvm::ArrayType* arrty = llvm::cast(_type); uint64_t n = arrty->getNumElements(); std::vector vals(n,_init); _init = llvm::ConstantArray::get(arrty, vals); } - else if (llvm::isa(_type)) { + else if (type->ty == Tarray) + { + assert(llvm::isa(_type)); + _init = llvm::ConstantAggregateZero::get(_type); + } + else if (type->ty == Tstruct) + { const llvm::StructType* structty = llvm::cast(_type); TypeStruct* ts = (TypeStruct*)type; assert(ts); @@ -592,8 +600,14 @@ void VarDeclaration::toObjFile() assert(ts->sym->llvmInitZ); _init = ts->sym->llvmInitZ; } - else - assert(0); + else if (type->ty == Tclass) + { + _init = llvm::Constant::getNullValue(_type); + } + else { + Logger::println("failed for type %s", type->toChars()); + assert(0); + } } gIR->topstruct().inits.push_back(_init); } diff --git a/test/bug3.d b/test/bug3.d new file mode 100644 index 00000000..bf000d87 --- /dev/null +++ b/test/bug3.d @@ -0,0 +1,16 @@ +module bug3; + +struct S +{ + int[] arr; + char[5] ch; +} + +void main() +{ + S s; + s.arr = new int[5]; + s.arr[1] = 32; + assert(s.arr[0] == 0); + assert(s.arr[1] == 32); +}