From c7aa3426b33c53d3ff1b32985931d9355fdd6812 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Wed, 6 Jan 2010 15:18:22 -0300 Subject: [PATCH] Merge DMD r319: bugzilla 400 forward reference error... bugzilla 400 forward reference error; no propety X for type Y (struct within struct). --- dmd/class.c | 19 +++++++++++++++++-- dmd/struct.c | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) --- dmd/class.c | 21 ++++++++++++++++++--- dmd/struct.c | 16 ++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/dmd/class.c b/dmd/class.c index ff03f12b..5f0225e5 100644 --- a/dmd/class.c +++ b/dmd/class.c @@ -593,9 +593,24 @@ void ClassDeclaration::semantic(Scope *sc) Scope scsave = *sc; int members_dim = members->dim; sizeok = 0; + + /* Set scope so if there are forward references, we still might be able to + * resolve individual members like enums. + */ for (i = 0; i < members_dim; i++) - { - Dsymbol *s = (Dsymbol *)members->data[i]; + { Dsymbol *s = (Dsymbol *)members->data[i]; + /* There are problems doing this in the general case because + * Scope keeps track of things like 'offset' + */ + if (s->isEnumDeclaration() || (s->isAggregateDeclaration() && s->ident)) + { + //printf("setScope %s %s\n", s->kind(), s->toChars()); + s->setScope(sc); + } + } + + for (i = 0; i < members_dim; i++) + { Dsymbol *s = (Dsymbol *)members->data[i]; s->semantic(sc); } @@ -1168,7 +1183,7 @@ void InterfaceDeclaration::semantic(Scope *sc) // Skip if b has already appeared for (int k = 0; k < i; k++) { - if (b == interfaces[i]) + if (b == interfaces[k]) goto Lcontinue; } diff --git a/dmd/struct.c b/dmd/struct.c index 27d21978..5712e844 100644 --- a/dmd/struct.c +++ b/dmd/struct.c @@ -307,6 +307,22 @@ void StructDeclaration::semantic(Scope *sc) sc2->explicitProtection = 0; int members_dim = members->dim; + + /* Set scope so if there are forward references, we still might be able to + * resolve individual members like enums. + */ + for (int i = 0; i < members_dim; i++) + { Dsymbol *s = (Dsymbol *)members->data[i]; + /* There are problems doing this in the general case because + * Scope keeps track of things like 'offset' + */ + if (s->isEnumDeclaration() || (s->isAggregateDeclaration() && s->ident)) + { + //printf("setScope %s %s\n", s->kind(), s->toChars()); + s->setScope(sc2); + } + } + for (i = 0; i < members_dim; i++) { Dsymbol *s = (Dsymbol *)members->data[i];