[Issue 20025] alias this combined with a copy constructor seems to lead to undefined behaviour.
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Jul 4 09:28:07 UTC 2019
https://issues.dlang.org/show_bug.cgi?id=20025
--- Comment #4 from Simen Kjaeraas <simen.kjaras at gmail.com> ---
There seems to be a lot inconsistencies here. This code:
struct S(bool _static, bool _field) {
static if (_static) static int value = 77;
else int value = 77;
static if (_field) int field = 13;
alias value this;
this(ref S rhs) { }
string toString() { return (_static ? "static, " : "non-static, ") ~
(_field ? "field" : "empty"); }
}
void test(T)(int i, ref int j, T t) {
import std.stdio;
writeln(t, ":");
writeln(" by val: ", i);
writeln(" by ref: ", j);
}
void test(T)(T t) {
test(t, t, t);
}
unittest {
test(S!(true, true)());
test(S!(true, false)());
test(S!(false, true)());
test(S!(false, false)());
}
Prints this on my machine (2.087.0):
static, field:
by val: 77
by ref: 13
static, empty:
by val: 7771469
by ref: 0
non-static, field:
by val: 77
by ref: 77
non-static, empty:
by val: 77
by ref: 77
And this on run.dlang.io (also 2.087.0):
static, field:
by val: 2007830860
by ref: 13
static, empty:
by val: 2007830868
by ref: 0
non-static, field:
by val: 2007830848
by ref: 77
non-static, empty:
by val: 2007830860
by ref: 77
The correct behavior, of course, is what's seen on my machine for both the
non-static cases.
--
More information about the Digitalmars-d-bugs
mailing list