mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-21 06:03:14 +01:00
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:
21
dmd/class.c
21
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;
|
||||
}
|
||||
|
||||
|
||||
16
dmd/struct.c
16
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];
|
||||
|
||||
Reference in New Issue
Block a user