[Issue 24196] New: _d_arraysetassign(S[],S.init): it not work on struct when it is “@disable this(this)”, dmd 2.105.2/ldc 1.35
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Oct 23 14:45:59 UTC 2023
https://issues.dlang.org/show_bug.cgi?id=24196
Issue ID: 24196
Summary: _d_arraysetassign(S[],S.init): it not work on struct
when it is “@disable this(this)”, dmd 2.105.2/ldc 1.35
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: dushibaiyu at foxmail.com
the struct when it is “@disable this(this)”, init the struct array use “T[] =
T.init” it not work.
The S is @disable this(this); t[] = S.init. the t[0].i should be 42, but it was
not.
import std.stdio;
import core.memory;
struct S { int i = 42; @disable this(this); }
struct D { int i = 24;}
void main()
{
writeln("@disable this(this);");
auto ptr = GC.malloc(S.sizeof * 5);
S[] t = cast(S[])(ptr[0..S.sizeof * 5]);
writeln(t[0].i);
t[] = S.init;
// foreach(ref ts ; t){ // this is work to 42
// ts = S.init;
// }
writeln(t[0].i); // it should be 42, but it not!
// assert(t[0].i == 42);
writeln("this(this);");
ptr = GC.malloc(D.sizeof * 5);
D[] d = cast(D[])(ptr[0..D.sizeof * 5]);
writeln(d[0].i);
d[] = D.init;
writeln(d[0].i);
writeln("this(this); D2");
ptr = GC.malloc(D.sizeof * 5);
D[] d2 = cast(D[])(ptr[0..D.sizeof * 5]);
writeln(d2[0].i);
D td;
td.i = 78;
d2[] = td;
writeln(d2[0].i);
assert(d[0].i == 24);
assert(d2[0].i == 78);
assert(t[0].i == 42);
}
当禁用复制构造的结构体时。对其数组进行初始化(T[] = T.init),会失败。
--
More information about the Digitalmars-d-bugs
mailing list