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(-)
This commit is contained in:
Leandro Lucarella
2010-01-06 15:18:22 -03:00
parent 063c55f49f
commit c7aa3426b3
2 changed files with 34 additions and 3 deletions

View File

@@ -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;
}

View File

@@ -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];