Mercurial > projects > ldc
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()