Mercurial > projects > ldc
comparison dmd/class.c @ 1625:79f64d5fee9e
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(-)
author | Leandro Lucarella <llucax@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 15:18:22 -0300 |
parents | 207a8a438dea |
children | 6c36e3f49b28 |
comparison
equal
deleted
inserted
replaced
1624:ae8a94d87ca9 | 1625:79f64d5fee9e |
---|---|
591 } | 591 } |
592 structsize = sc->offset; | 592 structsize = sc->offset; |
593 Scope scsave = *sc; | 593 Scope scsave = *sc; |
594 int members_dim = members->dim; | 594 int members_dim = members->dim; |
595 sizeok = 0; | 595 sizeok = 0; |
596 | |
597 /* Set scope so if there are forward references, we still might be able to | |
598 * resolve individual members like enums. | |
599 */ | |
596 for (i = 0; i < members_dim; i++) | 600 for (i = 0; i < members_dim; i++) |
597 { | 601 { Dsymbol *s = (Dsymbol *)members->data[i]; |
598 Dsymbol *s = (Dsymbol *)members->data[i]; | 602 /* There are problems doing this in the general case because |
603 * Scope keeps track of things like 'offset' | |
604 */ | |
605 if (s->isEnumDeclaration() || (s->isAggregateDeclaration() && s->ident)) | |
606 { | |
607 //printf("setScope %s %s\n", s->kind(), s->toChars()); | |
608 s->setScope(sc); | |
609 } | |
610 } | |
611 | |
612 for (i = 0; i < members_dim; i++) | |
613 { Dsymbol *s = (Dsymbol *)members->data[i]; | |
599 s->semantic(sc); | 614 s->semantic(sc); |
600 } | 615 } |
601 | 616 |
602 if (sizeok == 2) | 617 if (sizeok == 2) |
603 { // semantic() failed because of forward references. | 618 { // semantic() failed because of forward references. |
1166 { BaseClass *b = interfaces[i]; | 1181 { BaseClass *b = interfaces[i]; |
1167 | 1182 |
1168 // Skip if b has already appeared | 1183 // Skip if b has already appeared |
1169 for (int k = 0; k < i; k++) | 1184 for (int k = 0; k < i; k++) |
1170 { | 1185 { |
1171 if (b == interfaces[i]) | 1186 if (b == interfaces[k]) |
1172 goto Lcontinue; | 1187 goto Lcontinue; |
1173 } | 1188 } |
1174 | 1189 |
1175 // Copy vtbl[] from base class | 1190 // Copy vtbl[] from base class |
1176 if (b->base->vtblOffset()) | 1191 if (b->base->vtblOffset()) |