changeset 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 ae8a94d87ca9
children 8fa4ab3dcc88
files dmd/class.c dmd/struct.c
diffstat 2 files changed, 34 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/class.c	Wed Jan 06 15:18:22 2010 -0300
+++ b/dmd/class.c	Wed Jan 06 15:18:22 2010 -0300
@@ -593,9 +593,24 @@
     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 @@
 	// Skip if b has already appeared
 	for (int k = 0; k < i; k++)
 	{
-	    if (b == interfaces[i])
+	    if (b == interfaces[k])
 		goto Lcontinue;
 	}
 
--- a/dmd/struct.c	Wed Jan 06 15:18:22 2010 -0300
+++ b/dmd/struct.c	Wed Jan 06 15:18:22 2010 -0300
@@ -307,6 +307,22 @@
     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];