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())