| module test18545; |
| |
| enum Constness |
| { |
| Mutable, |
| Const, |
| Immutable, |
| } |
| |
| enum Cases = [Constness.Mutable, Constness.Const, Constness.Immutable]; |
| |
| void main() |
| { |
| static foreach (from; Cases) |
| { |
| static foreach (to; Cases) |
| { |
| test!(from, to)(); |
| } |
| } |
| } |
| |
| void test(Constness from, Constness to)() |
| { |
| struct S { |
| int i; |
| |
| @property int get() const { return 0; } |
| |
| alias get this; |
| } |
| |
| static if (from == Constness.Mutable) |
| { |
| alias ConstS = S; |
| } |
| else static if (from == Constness.Const) |
| { |
| alias ConstS = const(S); |
| } |
| else |
| { |
| alias ConstS = immutable(S); |
| } |
| |
| ConstS s1 = S(42); |
| |
| // this should reinterpret-cast, NOT call the implicit constructor with .get! |
| static if (to == Constness.Mutable) |
| { |
| auto s2 = cast() s1; |
| } |
| else static if (to == Constness.Const) |
| { |
| const s2 = cast(const) s1; |
| } |
| else static if (to == Constness.Immutable) |
| { |
| immutable s2 = cast(immutable) s1; |
| } |
| |
| assert(s2.i == s1.i, "Bug 18545 occurred casting from "~from.stringof~" to "~to.stringof); |
| } |