August 02, 2021

Hello,

Why this doesn't work:

template DestructorType(T){

	alias Get(T) = T;

    alias DestructorType = Get!(typeof((void*){
    	T tmp;
    }));
}

struct Foo{

    ~this()@safe{}
}
void main(){
    //Error: static assert:  `is(void function(void*) pure nothrow @nogc @safe : void function(void*) @safe)` is false
    static assert(is(void function(void*)pure nothrow @safe @nogc : DestructorType!Foo));

}

but this work:


void main(){

    alias X = void function(void*)@safe;


    static assert(is(void function(void*)pure nothrow @safe @nogc : DestructorType!Foo));

}
August 04, 2021
On 02.08.21 22:14, vit wrote:
> Why this doesn't work:
> ```d
> template DestructorType(T){
> 
>      alias Get(T) = T;
> 
>      alias DestructorType = Get!(typeof((void*){
>          T tmp;
>      }));
> }
> 
> struct Foo{
> 
>      ~this()@safe{}
> }
> ```
> 
> 
> ```d
> void main(){
>      //Error: static assert:  `is(void function(void*) pure nothrow @nogc @safe : void function(void*) @safe)` is false
>      static assert(is(void function(void*)pure nothrow @safe @nogc : DestructorType!Foo));
> 
> }
> 
> ```
> 
> but this work:
> ```d
> 
> void main(){
> 
>      alias X = void function(void*)@safe;
> 
> 
>      static assert(is(void function(void*)pure nothrow @safe @nogc : DestructorType!Foo));
> 
> }
> ```

Looks like you found a compiler bug. An unused alias should have any effect.