diff dmd/func.c @ 1358:78038e540342

Fix overload resolution issue in dmd bug 313/314 fix.
author Christian Kamm <kamm incasoftware de>
date Sat, 16 May 2009 12:17:33 +0200
parents a41a40deff73
children 194852badf8c
line wrap: on
line diff
--- a/dmd/func.c	Fri May 15 17:17:20 2009 +0200
+++ b/dmd/func.c	Sat May 16 12:17:33 2009 +0200
@@ -326,7 +326,7 @@
 		    if (s)
 		    {
 			FuncDeclaration *f = s->isFuncDeclaration();
-			f = f->overloadExactMatch(type);
+			f = f->overloadExactMatch(type, getModule());
 			if (f && f->isFinal() && f->prot() != PROTprivate)
 			    error("cannot override final function %s", f->toPrettyChars());
 		    }
@@ -1530,7 +1530,7 @@
  *	1	done
  */
 
-int overloadApply(FuncDeclaration *fstart,
+int overloadApply(Module* from, FuncDeclaration *fstart,
 	int (*fp)(void *, FuncDeclaration *),
 	void *param)
 {
@@ -1543,8 +1543,9 @@
 
 	if (fa)
 	{
-	    if (overloadApply(fa->funcalias, fp, param))
-		return 1;
+	    if (fa->getModule() == from || fa->importprot != PROTprivate)
+		if (overloadApply(from, fa->funcalias, fp, param))
+		    return 1;
 	    next = fa->overnext;
 	}
 	else
@@ -1613,12 +1614,12 @@
     return 0;
 }
 
-FuncDeclaration *FuncDeclaration::overloadExactMatch(Type *t)
+FuncDeclaration *FuncDeclaration::overloadExactMatch(Type *t, Module* from)
 {
     Param1 p;
     p.t = t;
     p.f = NULL;
-    overloadApply(this, &fp1, &p);
+    overloadApply(from, this, &fp1, &p);
     return p.f;
 }
 
@@ -1721,12 +1722,12 @@
 }
 
 
-void overloadResolveX(Match *m, FuncDeclaration *fstart, Expressions *arguments)
+void overloadResolveX(Match *m, FuncDeclaration *fstart, Expressions *arguments, Module* from)
 {
     Param2 p;
     p.m = m;
     p.arguments = arguments;
-    overloadApply(fstart, &fp2, &p);
+    overloadApply(from, fstart, &fp2, &p);
 }
 
 #if 0
@@ -1811,7 +1812,7 @@
 }
 #endif
 
-FuncDeclaration *FuncDeclaration::overloadResolve(Loc loc, Expressions *arguments)
+FuncDeclaration *FuncDeclaration::overloadResolve(Loc loc, Expressions *arguments, Module* from)
 {
     TypeFunction *tf;
     Match m;
@@ -1834,7 +1835,7 @@
 
     memset(&m, 0, sizeof(m));
     m.last = MATCHnomatch;
-    overloadResolveX(&m, this, arguments);
+    overloadResolveX(&m, this, arguments, from);
 
     if (m.count == 1)		// exactly one match
     {
@@ -2253,6 +2254,7 @@
 {
     assert(funcalias != this);
     this->funcalias = funcalias;
+    importprot = PROTundefined;
 }
 
 const char *FuncAliasDeclaration::kind()