blob: 33d595cfedbc7d900ff2fe3610c33b7d112910db [file] [log] [blame]
// PERMUTE_ARGS:
// REQUIRED_ARGS:
/*
TEST_OUTPUT:
---
output foo: 1e: pure nothrow @nogc @safe void(int x)
output foo: 3e: pure nothrow @nogc @safe void(int x)
---
*/
alias void function(int) pure nothrow @safe @nogc FuncPtrType;
void foo1a(X)(X x) {}
void foo1b(X)(X x) {}
void foo1c(X)(X x) {}
void foo1d(X)(X x) {}
void foo1e(X)(X x) {}
// module level declaration with type inference
auto fptr1 = &foo1a!int;
static assert(is(typeof(fptr1) == FuncPtrType));
// array initializer
auto fptrlist1 = [&foo1b!int];
static assert(is(typeof(fptrlist1) == FuncPtrType[]));
// static assert
static assert(is(typeof(&foo1c!int) == FuncPtrType));
// static if
static if(is(typeof(&foo1d!int) PF))
static assert(is(PF == FuncPtrType));
else
static assert(0);
// pragma test
pragma(msg, "output foo: 1e: ", typeof(foo1e!int).stringof);
void foo2a(X)(X x) {}
void foo2b(X)(X x) {}
void foo2c(X)(X x) {}
FuncPtrType fptr3 = &foo2a!int; // most similar to original issue
FuncPtrType[] fptrlist3 = [&foo2b!int];
struct S{ FuncPtrType fp; }
S s = { &foo2c!int };
void foo3a(X)(X x) {}
void foo3b(X)(X x) {}
void foo3c(X)(X x) {}
void foo3d(X)(X x) {}
void foo3e(X)(X x) {}
void main()
{
auto fptr2 = &foo3a!int;
static assert(is(typeof(fptr2) == FuncPtrType));
auto fptrlist2 = [&foo3b!int];
static assert(is(typeof(fptrlist2) == FuncPtrType[]));
static assert(is(typeof(&foo1c!int) == FuncPtrType));
static if(is(typeof(&foo1d!int) PF))
static assert(is(PF == FuncPtrType));
else
static assert(0);
pragma(msg, "output foo: 3e: ", typeof(foo3e!int));
}