mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
63 lines
1.1 KiB
D
63 lines
1.1 KiB
D
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);
|
|
}
|