Mercurial > projects > ldc
diff dmd2/class.c @ 1526:54b3c1394d62
Merged dmdfe 2.031.
author | Robert Clipsham <robert@octarineparrot.com> |
---|---|
date | Tue, 07 Jul 2009 02:26:11 +0100 |
parents | 638d16625da2 |
children | e4f7b5d9c68a |
line wrap: on
line diff
--- a/dmd2/class.c Mon Jul 06 23:57:27 2009 +0100 +++ b/dmd2/class.c Tue Jul 07 02:26:11 2009 +0100 @@ -1,6 +1,6 @@ // Compiler implementation of the D programming language -// Copyright (c) 1999-2008 by Digital Mars +// Copyright (c) 1999-2009 by Digital Mars // All Rights Reserved // written by Walter Bright // http://www.digitalmars.com @@ -233,14 +233,14 @@ ident = Identifier::generateId(id); } - if (!scope) - { - if (!parent && sc->parent && !sc->parent->isModule()) - parent = sc->parent; + if (!sc) + sc = scope; + if (!parent && sc->parent && !sc->parent->isModule()) + parent = sc->parent; - type = type->semantic(loc, sc); - handle = handle->semantic(loc, sc); - } + type = type->semantic(loc, sc); + handle = type; + if (!members) // if forward reference { //printf("\tclass '%s' is forward referenced\n", toChars()); return; @@ -275,7 +275,9 @@ // Expand any tuples in baseclasses[] for (i = 0; i < baseclasses.dim; ) { BaseClass *b = (BaseClass *)baseclasses.data[i]; +//printf("test1 %s %s\n", toChars(), b->type->toChars()); b->type = b->type->semantic(loc, sc); +//printf("test2\n"); Type *tb = b->type->toBasetype(); if (tb->ty == Ttuple) @@ -334,8 +336,14 @@ goto L7; } } + if (!tc->sym->symtab || tc->sym->sizeok == 0) + { // Try to resolve forward reference + if (sc->mustsemantic && tc->sym->scope) + tc->sym->semantic(NULL); + } if (!tc->sym->symtab || tc->sym->scope || tc->sym->sizeok == 0) { + //printf("%s: forward reference of base class %s\n", toChars(), tc->sym->toChars()); //error("forward reference of base class %s", baseClass->toChars()); // Forward reference of base class, try again later //printf("\ttry later, forward reference of base class %s\n", tc->sym->toChars()); @@ -793,10 +801,15 @@ //printf("%s.ClassDeclaration::search('%s')\n", toChars(), ident->toChars()); if (scope) - semantic(scope); + { Scope *sc = scope; + sc->mustsemantic++; + semantic(sc); + sc->mustsemantic--; + } if (!members || !symtab || scope) - { error("is forward referenced when looking for '%s'", ident->toChars()); + { + error("is forward referenced when looking for '%s'", ident->toChars()); //*(char*)0=0; return NULL; } @@ -1037,10 +1050,15 @@ //printf("InterfaceDeclaration::semantic(%s), type = %p\n", toChars(), type); if (inuse) return; - if (!scope) - { type = type->semantic(loc, sc); - handle = handle->semantic(loc, sc); - } + + if (!sc) + sc = scope; + if (!parent && sc->parent && !sc->parent->isModule()) + parent = sc->parent; + + type = type->semantic(loc, sc); + handle = type; + if (!members) // if forward reference { //printf("\tinterface '%s' is forward referenced\n", toChars()); return;