extern(Windows) alias bug

John C johnch_atms at hotmail.com
Tue May 30 02:21:56 PDT 2006


Regan Heath wrote:
> On Mon, 29 May 2006 22:50:23 +0100, John C <johnch_atms at hotmail.com> wrote:
> 
>> The following are not equivalent, though I can't understand why not.
>>
>> template TFunc1() {
>>    extern(Windows) alias int function(int) TFunc1;
>> }
>>
>> alias int function(int) funcA;
>> template TFunc2() {
>>    extern(Windows) alias funcA TFunc2;
>> }
>>
>> void main() {
>>    writefln(TFunc1!().mangleof); // PWiZi
>>    writefln(TFunc2!().mangleof); // PFiZi
>> }
>>
>> So the extern(Windows) gets applied to TFunc1, but not TFunc2.
> 
> 
> At a wild guess.. doesn't the alias:
>   alias int function(int) funcA;
> 
> have an implicit "D calling convention" (extern(D)?) 
> label/tag/specifier,  eg.
>   alias extern(D) int function(int) funcA;
> 
> so, the alias:
>   extern(Windows) alias funcA TFunc2;
> 
> really reads something like:
>   extern(Windows) alias extern(D) int function(int) TFunc2;
> 
> and maybe the later one overrules the former?
> 
> Regan

You may be right there. The reason why I wanted this to work is because 
this doesn't:

template TFunc(T) {
   ...
}

TFunc!(extern(Windows) int function(int));

A nice workaround would have been to have another template apply the 
calling convention:

template ExternWindows(T) {
   extern(Windows) alias T ExternWindows;
}

TFunc!(ExternWindows!(int function(int, char*, char*, int));

I guess I'm now wondering why extern can't be used inline. It'd be 
useful in the above situation, and on anonymous function literals.

John.



More information about the Digitalmars-d-bugs mailing list