| // https://issues.dlang.org/show_bug.cgi?id=21380 |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test21380.d(39): Error: partial template instance `MySerializer().serializeSinkType!int` has no value |
| fail_compilation/test21380.d(44): Error: template instance `test21380.SupportSinkTypeSer!(MySerializer!int)` error instantiating |
| --- |
| */ |
| |
| template isSomeFunction(T...) |
| if (T.length == 1) |
| { |
| static if (is(typeof(& T[0]) U : U*) && is(U == function) || is(typeof(& T[0]) U == delegate)) |
| { |
| // T is a (nested) function symbol. |
| enum bool isSomeFunction = true; |
| } |
| else static if (is(T[0] W) || is(typeof(T[0]) W)) |
| { |
| // T is an expression or a type. Take the type of it and examine. |
| static if (is(W F : F*) && is(F == function)) |
| enum bool isSomeFunction = true; // function pointer |
| else |
| enum bool isSomeFunction = is(W == function) || is(W == delegate); |
| } |
| else |
| enum bool isSomeFunction = false; |
| } |
| |
| struct MySerializer (T) |
| { |
| void serializeSinkType(T2) (scope auto ref T2 record) {} |
| } |
| |
| template SupportSinkTypeSer(SerT) |
| { |
| /* Note: Partial template instance because it needs inference, in this case |
| it cannot infer 'auto ref' parameter */ |
| enum SupportSinkTypeSer = isSomeFunction!(SerT.init.serializeSinkType!int); |
| } |
| |
| int main() |
| { |
| enum x = SupportSinkTypeSer!(MySerializer!int); |
| return 0; |
| } |