diff gen/toir.cpp @ 587:23538d0f0d5b

Fixed a few mini tests issues. Added 'darwin' and 'Posix' as versions user can't set. Fixed #80 .
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Thu, 11 Sep 2008 21:10:15 +0200
parents fbb1a366cfbc
children e6bcc4d9e5ff
line wrap: on
line diff
--- a/gen/toir.cpp	Wed Sep 10 12:33:33 2008 -0700
+++ b/gen/toir.cpp	Thu Sep 11 21:10:15 2008 +0200
@@ -2156,12 +2156,20 @@
     Logger::cout() << (dyn?"dynamic":"static") << " array literal with length " << len << " of D type: '" << arrayType->toChars() << "' has llvm type: '" << *llType << "'\n";
 
     // llvm storage type
-    const LLType* llStoType = LLArrayType::get(DtoType(elemType), len);
+    const LLType* llElemType = DtoTypeNotVoid(elemType);
+    const LLType* llStoType = LLArrayType::get(llElemType, len);
     Logger::cout() << "llvm storage type: '" << *llStoType << "'\n";
 
+    // don't allocate storage for zero length dynamic array literals
+    if (dyn && len == 0)
+    {
+        // dmd seems to just make them null...
+        return new DSliceValue(type, DtoConstSize_t(0), getNullPtr(getPtrToType(llElemType)));
+    }
+
     // dst pointer
-    LLValue* dstMem = 0;
-    dstMem = DtoAlloca(llStoType, "arrayliteral");
+    // FIXME: dynamic array literals should be allocated with the GC
+    LLValue* dstMem = DtoAlloca(llStoType, "arrayliteral");
 
     // store elements
     for (size_t i=0; i<len; ++i)