On 4/20/2013 1:50 AM, Mehrdad wrote:
On Saturday, 20 April 2013 at 06:25:09 UTC, Walter Bright wrote:
On 4/19/2013 11:12 PM, deadalnix wrote:
But some time, you can't alias (in case of inference for instance) and so
can't choose what attribute bind to.
Example, please.
Here you go:
void foo(T)(extern(C) T function() function() f);
Try making the extern(C) apply to each of:
1. the result of f()
2. the result of f()()
without breaking foo()'s type inference.
What I've been trying to explain is that there's a difference between a storage
class attribute and a type constructor. When pure, for example, is used as a
storage class attribute, it applies to the declaration always. When pure is used
as a type constructor, it applies to the type, always. There is no ambiguity
about this, and no problem about choice.
For your example, for purity:
void foo(T)(T function() pure function() pure f);
The only issue here is that extern(C) is not currently supported as a type
constructor. If it were, the example would look like:
void foo(T)(T function() extern(C) function() extern(C) f);
Again, there is no ambiguity.