February 16, 2004
The specification says:
"In D, function overloading is simple. It matches exactly, it matches with
implicit conversions, or it does not match. If there is more than one match, it
is an error."

But this isn't true. There are "better matches" (to speak in terms of C++):

class Foo {}
class Bar : Foo {}
class Baz : Bar {}

void func (Foo foo)
{
printf ("Foo");
}
void func (Bar bar)
{
printf ("Bar");
}

int main ()
{
Baz baz = new Baz();
func (baz);
return 0;
}



This calles 'void func(Bar)'. So 'void func(Bar)' is a Better match than 'void
func(Foo)' as both don't match exactly.

So I'd like you to change the specification rather than fixing the "bug".


February 22, 2004
When I compile the example, I get the expected:

test.d(18): function func overloads void(Foo foo) and void(Bar bar) both
match a
rgument list for func

I'm going to leave it as is, due to the quagmire of going down the path of deciding what constitutes a better match <g>.