On 04/26/2012 09:54 AM, Walter Bright wrote:
On 4/26/2012 12:47 AM, Timon Gehr wrote:
On 04/26/2012 05:44 AM, Walter Bright wrote:
A subtle but nasty problem - are default arguments part of the type, or
part of the declaration?

See http://d.puremagic.com/issues/show_bug.cgi?id=3866

Currently, they are both,

That is how it should be.

which leads to the nasty behavior in the bug report.


It contributes, but it is not the main cause.

The problem centers around name mangling. If two types mangle the same,
then they are the same type.

Then they are equal types.

This is simply not tenable. What defines when they are "equal" types and
when they are "not equal"?

This is a matter of terminology. For example, for 'equal' just exclude the default parameters from the comparison. For 'the same' include default parameters in the comparison. (therefore, 'the same' implies 'equal')

Consider a pointer to a function. Are the
default arguments part of its type?

Yes.

If it compares "equal" to another type without default arguments, which is the 
real type (such as the
result of ?:) ?


The result of ?: is the type of the two arguments if they are the same, and it is the equal type without default arguments if they are not the same.


But default arguments are not part of the
mangled string. Hence the schizophrenic behavior.


The schizophrenic behavior occurs because the types cross-talk. Are
mangled
names kept unique in the compiler or what is the implementation issue
exactly?

It's a conceptual issue.  When is one type the same as another, and when
is it not?


void function(int) is the same as void function(int) and both are equal
void function(int=2) is not the same as void function(int=3), but both are equal.

Reply via email to