diff gen/structs.cpp @ 800:d14e4594c7d7

Changed aggregate field initializers to be created lazily, fixes problem with static void arrays in aggregates.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 29 Nov 2008 18:28:17 +0100
parents 340acf1535d0
children 28ce72c60a21
line wrap: on
line diff
--- a/gen/structs.cpp	Sat Nov 29 21:25:43 2008 +0100
+++ b/gen/structs.cpp	Sat Nov 29 18:28:17 2008 +0100
@@ -208,6 +208,8 @@
 
                 // do the default
                 Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset);
+                if (!nextdef->ir.irField->constInit)
+                    nextdef->ir.irField->constInit = DtoConstFieldInitializer(nextdef->loc, nextdef->type, nextdef->init);
                 LLConstant* c = nextdef->ir.irField->constInit;
                 inits.push_back(c);
 
@@ -261,6 +263,8 @@
 
             // do the default
             Logger::println("adding default field: %s : +%u", nextdef->toChars(), nextdef->offset);
+            if (!nextdef->ir.irField->constInit)
+                nextdef->ir.irField->constInit = DtoConstFieldInitializer(nextdef->loc, nextdef->type, nextdef->init);
             LLConstant* c = nextdef->ir.irField->constInit;
             inits.push_back(c);
 
@@ -463,15 +467,6 @@
 
     const llvm::StructType* structtype = isaStruct(sd->type->ir.type->get());
 
-    // make sure each offset knows its default initializer
-    Array* fields = &sd->fields;
-    for (int k=0; k < fields->dim; k++)
-    {
-        VarDeclaration* v = (VarDeclaration*)fields->data[k];
-        LLConstant* finit = DtoConstFieldInitializer(v->loc, v->type, v->init);
-        v->ir.irField->constInit = finit;
-    }
-
     // always generate the constant initalizer
     if (sd->zeroInit)
     {