| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test13667.d(112): Error: cannot cast expression `this` of type `const(Array1!int)` to `Array1!int*` |
| fail_compilation/test13667.d(116): Error: template instance `test13667.Array1!int` error instantiating |
| fail_compilation/test13667.d(121): Error: cannot cast expression `this` of type `const(Array2!int)` to `B*` |
| fail_compilation/test13667.d(125): Error: template instance `test13667.Array2!int` error instantiating |
| fail_compilation/test13667.d(136): Error: cannot cast expression `this` of type `const(Array3!int)` to `C*` |
| fail_compilation/test13667.d(140): Error: template instance `test13667.Array3!int` error instantiating |
| fail_compilation/test13667.d(151): Error: cannot cast expression `this` of type `const(Array4!int)` to `D*` |
| fail_compilation/test13667.d(155): Error: template instance `test13667.Array4!int` error instantiating |
| fail_compilation/test13667.d(172): Error: cannot cast expression `this` of type `const(Array5!int)` to `F*` |
| fail_compilation/test13667.d(176): Error: template instance `test13667.Array5!int` error instantiating |
| --- |
| */ |
| |
| // https://issues.dlang.org/show_bug.cgi?id=13667 |
| |
| #line 100 |
| // 0, no error but also crashed before |
| struct Array0(T) |
| { |
| Array0!(T) impConv() const { return cast(typeof(return))this; } |
| alias impConv this; |
| } |
| |
| alias AI0 = Array0!int; |
| |
| // 1 |
| struct Array1(T) |
| { |
| Array1!(T) impConv() const { return *cast(typeof(return)*)this; } |
| alias impConv this; |
| } |
| |
| alias AI1 = Array1!int; |
| |
| // 2 |
| struct Array2(T) |
| { |
| B impConv() const { return cast(B*)this; } |
| alias impConv this; |
| } |
| |
| alias AI2 = Array2!int; |
| |
| struct B |
| { |
| AI2 get() { return AI2(); } |
| alias get this; |
| } |
| |
| // 3 |
| struct Array3(T) |
| { |
| C impConv() const { return cast(C*)this; } |
| alias impConv this; |
| } |
| |
| alias AI3 = Array3!int; |
| |
| struct C |
| { |
| C get() { return C(); } |
| alias get this; |
| } |
| |
| // 4 |
| struct Array4(T) |
| { |
| D impConv() const { return cast(D*)this; } |
| alias impConv this; |
| } |
| |
| alias AI4 = Array4!int; |
| |
| struct D |
| { |
| E get() { return E(); } |
| alias get this; |
| } |
| |
| struct E |
| { |
| AI4 ai; |
| alias ai this; |
| } |
| |
| // 5: test enum based on struct, needed to use base type (toBasetype()) |
| struct Array5(T) |
| { |
| F impConv() const { return cast(F*)this; } |
| alias impConv this; |
| } |
| |
| alias AI5 = Array5!int; |
| |
| enum F : AI5 |
| { |
| f = AI5() |
| } |