Using 2.063.2 and 2.064-devel-333c6dd:
import std.concurrency : receiveOnly, send, thisTid;
import std.exception : assumeUnique;
import std.variant;
struct JustRight
{
byte[32] j;
}
struct TooBig
{
byte[33] t;
}
void main()
{
JustRight[1] jArray;
TooBig[1] tArray;
Variant vj = jArray[];
Variant vt = tArray[];
thisTid.send(vj);
thisTid.send(vt);
thisTid.send(assumeUnique(jArray[]));
//thisTid.send(assumeUnique(tArray[])); // Fails to compile
auto received = receiveOnly!((JustRight)[]);
}
If the send of tArray is commented out the compilation fails with:
src/phobos/std/variant.d(558): Error: cannot modify immutable expression *p
So, 32-byte structs can be sent (as arrays) using send or if you first wrap it in an Variant object. Greater than 32-byte structs can be sent ONLY if they are pre-wrapped in a Variant. The size of the data shouldn't limit it from being sent using send().
Comment #1 by david — 2013-08-01T04:33:47Z
Should have said:
"If the send of tArray is uncommented the compilation fails with:"
Comment #2 by johannespfau — 2013-08-24T06:08:34Z
There recently was a bug report for GDC/ARM regarding this. As variants max size is determined by creal which is only 16 bytes on most non-x86 architectures this error already happens with structs > 16 bytes on these architectures.
Another test case with different error message:
---------
struct Big
{
int[10] a;
}
import std.concurrency, std.variant, core.thread;
void loop()
{
while(true)
{
Thread.sleep(seconds(10));
}
}
void main()
{
auto x = spawn(&loop);
x.send(Big());
}
---------
http://dpaste.dzfl.pl/f103dbac
core.exception.AssertError@/opt/compilers/dmd2/include/std/variant.d(280): target must be non-null
Comment #3 by mk — 2014-01-07T18:45:32Z
Comment #2 is bug 9122. Comment #0 still open (the limit is 24 bytes for me).
Comment #4 by secondaryAccount — 2015-09-02T18:43:20Z
still valid with dmd 2.068, but the location of the error changed:
dmd/phobos/std/variant.d(634): Error: cannot modify immutable expression *p
dmd/phobos/std/variant.d(420): Error: template instance std.variant.VariantN!32LU.VariantN.opAssign!(immutable(TooBig)) error instantiating
[...]
Comment #5 by robert.schadek — 2024-12-01T16:18:29Z