# HG changeset patch # User Christian Kamm # Date 1233680417 -3600 # Node ID 75c53f8f67a4bf42f12fc4c006029abbe6243500 # Parent 545f54041d9178841ebb5ffb3607d2576051758d Apply StaticStructInit changes from [913] to dmd2/ diff -r 545f54041d91 -r 75c53f8f67a4 dmd2/declaration.c --- a/dmd2/declaration.c Tue Feb 03 08:54:57 2009 +0100 +++ b/dmd2/declaration.c Tue Feb 03 18:00:17 2009 +0100 @@ -1647,4 +1647,13 @@ return NULL; } - + +/********************** StaticStructInitDeclaration ***************************/ + +StaticStructInitDeclaration::StaticStructInitDeclaration(Loc loc, StructDeclaration *dsym) + : Declaration(new Identifier("", TOKidentifier)) +{ + this->loc = loc; + this->dsym = dsym; + storage_class |= STCconst; +} diff -r 545f54041d91 -r 75c53f8f67a4 dmd2/declaration.h --- a/dmd2/declaration.h Tue Feb 03 08:54:57 2009 +0100 +++ b/dmd2/declaration.h Tue Feb 03 18:00:17 2009 +0100 @@ -284,19 +284,18 @@ /**************************************************************/ -// This is a shell around a back end symbol +// LDC uses this to denote static struct initializers -struct SymbolDeclaration : Declaration +struct StaticStructInitDeclaration : Declaration { - Symbol *sym; StructDeclaration *dsym; - SymbolDeclaration(Loc loc, Symbol *s, StructDeclaration *dsym); + StaticStructInitDeclaration(Loc loc, StructDeclaration *dsym); Symbol *toSymbol(); // Eliminate need for dynamic_cast - SymbolDeclaration *isSymbolDeclaration() { return (SymbolDeclaration *)this; } + StaticStructInitDeclaration *isStaticStructInitDeclaration() { return (StaticStructInitDeclaration *)this; } }; struct ClassInfoDeclaration : VarDeclaration diff -r 545f54041d91 -r 75c53f8f67a4 dmd2/dsymbol.h --- a/dmd2/dsymbol.h Tue Feb 03 08:54:57 2009 +0100 +++ b/dmd2/dsymbol.h Tue Feb 03 18:00:17 2009 +0100 @@ -65,7 +65,7 @@ struct ScopeDsymbol; struct WithScopeSymbol; struct ArrayScopeSymbol; -struct SymbolDeclaration; +struct StaticStructInitDeclaration; struct Expression; struct DeleteDeclaration; struct HdrGenState; @@ -219,7 +219,7 @@ #ifdef _DH virtual DeleteDeclaration *isDeleteDeclaration() { return NULL; } #endif - virtual SymbolDeclaration *isSymbolDeclaration() { return NULL; } + virtual StaticStructInitDeclaration *isStaticStructInitDeclaration() { return NULL; } virtual AttribDeclaration *isAttribDeclaration() { return NULL; } virtual OverloadSet *isOverloadSet() { return NULL; } virtual TypeInfoDeclaration* isTypeInfoDeclaration() { return NULL; } diff -r 545f54041d91 -r 75c53f8f67a4 dmd2/interpret.c --- a/dmd2/interpret.c Tue Feb 03 08:54:57 2009 +0100 +++ b/dmd2/interpret.c Tue Feb 03 18:00:17 2009 +0100 @@ -987,7 +987,7 @@ { Expression *e = EXP_CANT_INTERPRET; VarDeclaration *v = d->isVarDeclaration(); - SymbolDeclaration *s = d->isSymbolDeclaration(); + StaticStructInitDeclaration *s = d->isStaticStructInitDeclaration(); if (v) { #if DMDV2 @@ -1011,11 +1011,9 @@ } else if (s) { - if (s->dsym->toInitializer() == s->sym) - { Expressions *exps = new Expressions(); - e = new StructLiteralExp(0, s->dsym, exps); - e = e->semantic(NULL); - } + Expressions *exps = new Expressions(); + e = new StructLiteralExp(0, s->dsym, exps); + e = e->semantic(NULL); } return e; } @@ -1466,10 +1464,10 @@ if (v->value && v->value->op == TOKvar) { VarExp *ve2 = (VarExp *)v->value; - if (ve2->var->isSymbolDeclaration()) + if (ve2->var->isStaticStructInitDeclaration()) { /* This can happen if v is a struct initialized to - * 0 using an __initZ SymbolDeclaration from + * 0 using an StaticStructInitDeclaration from * TypeStruct::defaultInit() */ } diff -r 545f54041d91 -r 75c53f8f67a4 dmd2/mtype.c --- a/dmd2/mtype.c Tue Feb 03 08:54:57 2009 +0100 +++ b/dmd2/mtype.c Tue Feb 03 18:00:17 2009 +0100 @@ -5249,14 +5249,12 @@ } Expression *TypeStruct::defaultInit(Loc loc) -{ Symbol *s; - Declaration *d; +{ Declaration *d; #if LOGDEFAULTINIT printf("TypeStruct::defaultInit() '%s'\n", toChars()); #endif - s = sym->toInitializer(); - d = new SymbolDeclaration(sym->loc, s, sym); + d = new StaticStructInitDeclaration(sym->loc, sym); assert(d); d->type = this; return new VarExp(sym->loc, d);