Showing with 34 additions and 10 deletions.
  1. +11 −4 src/dsymbol.d
  2. +2 −6 src/dtemplate.d
  3. +21 −0 test/runnable/template9.d
15 changes: 11 additions & 4 deletions src/dsymbol.d
Original file line number Diff line number Diff line change
Expand Up @@ -842,15 +842,15 @@ public:
*/
final static bool oneMembers(Dsymbols* members, Dsymbol* ps, Identifier ident)
{
//printf("Dsymbol::oneMembers() %d\n", members ? members->dim : 0);
//printf("Dsymbol::oneMembers() %d\n", members ? members.dim : 0);
Dsymbol s = null;
if (members)
{
for (size_t i = 0; i < members.dim; i++)
{
Dsymbol sx = (*members)[i];
bool x = sx.oneMember(ps, ident);
//printf("\t[%d] kind %s = %d, s = %p\n", i, sx->kind(), x, *ps);
//printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps);
if (!x)
{
//printf("\tfalse 1\n");
Expand All @@ -859,12 +859,19 @@ public:
}
if (*ps)
{
static bool isOverloadableAlias(Dsymbol s)
{
auto ad = s.isAliasDeclaration();
return ad && ad.aliassym && ad.aliassym.isOverloadable();
}

assert(ident);
if (!(*ps).ident || !(*ps).ident.equals(ident))
continue;
if (!s)
s = *ps;
else if (s.isOverloadable() && (*ps).isOverloadable())
else if (( s .isOverloadable() || isOverloadableAlias( s)) &&
((*ps).isOverloadable() || isOverloadableAlias(*ps)))
{
// keep head of overload set
FuncDeclaration f1 = s.isFuncDeclaration();
Expand Down Expand Up @@ -892,7 +899,7 @@ public:
}
}
}
*ps = s; // s is the one symbol, NULL if none
*ps = s; // s is the one symbol, null if none
//printf("\ttrue\n");
return true;
}
Expand Down
8 changes: 2 additions & 6 deletions src/dtemplate.d
Original file line number Diff line number Diff line change
Expand Up @@ -5742,9 +5742,7 @@ public:
Dsymbol s;
if (Dsymbol.oneMembers(members, &s, tempdecl.ident) && s)
{
//printf("s->kind = '%s'\n", s->kind());
//s->print();
//printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars());
//printf("tempdecl.ident = %s, s = '%s'\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars());
//printf("setting aliasdecl\n");
aliasdecl = s;
}
Expand Down Expand Up @@ -5787,9 +5785,7 @@ public:
{
if (!aliasdecl || aliasdecl != s)
{
//printf("s->kind = '%s'\n", s->kind());
//s->print();
//printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars());
//printf("tempdecl.ident = %s, s = '%s'\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars());
//printf("setting aliasdecl 2\n");
aliasdecl = s;
}
Expand Down
21 changes: 21 additions & 0 deletions test/runnable/template9.d
Original file line number Diff line number Diff line change
Expand Up @@ -4691,6 +4691,26 @@ void test14886()
static assert(is(typeof(bar2(R.init, x)) == int));
}

/******************************************/
// 15156

// 15156
auto f15116a(T)(string s, string arg2) { return 1; }
auto f15116b(T)(int i, string arg2) { return 2; }

template bish15116(T)
{
alias bish15116 = f15116a!T;
alias bish15116 = f15116b!T;
}

void test15116()
{
alias func = bish15116!string;
assert(func("", "") == 1);
assert(func(12, "") == 2);
}

/******************************************/

int main()
Expand Down Expand Up @@ -4804,6 +4824,7 @@ int main()
test14836();
test14735();
test14802();
test15116();

printf("Success\n");
return 0;
Expand Down