I was exploring the included samples to get a feel for the language and found the coroutine version of the shooter tutorial was acting in a very strange and unexpected manner.
I isolated the behavior with this snippet.
Running it produces...
Process started (PID=14788) >>>
Running coroutine version
id:0 iter:0 xyzw_i{1, 2, 3, 4}
id:0 iter:0 xyzw_i{2, 4, 6, 8}
id:1 iter:0 xyzw_i{1, 4, 6, 8}
id:1 iter:0 xyzw_i{2, 8, 12, 16}
id:2 iter:0 xyzw_i{1, 8, 12, 16}
id:2 iter:0 xyzw_i{2, 16, 24, 32}
id:3 iter:0 xyzw_i{1, 16, 24, 32}
id:3 iter:0 xyzw_i{2, 32, 48, 64}
id:0 iter:1 xyzw_i{2, 32, 48, 64}
id:0 iter:1 xyzw_i{4, 64, 96, 128}
id:1 iter:1 xyzw_i{2, 64, 96, 128}
id:1 iter:1 xyzw_i{4, 128, 192, 256}
id:2 iter:1 xyzw_i{2, 128, 192, 256}
id:2 iter:1 xyzw_i{4, 256, 384, 512}
id:3 iter:1 xyzw_i{2, 256, 384, 512}
id:3 iter:1 xyzw_i{4, 512, 768, 1024}
id:0 iter:2 xyzw_i{4, 512, 768, 1024}
id:0 iter:2 xyzw_i{8, 1024, 1536, 2048}
id:1 iter:2 xyzw_i{4, 1024, 1536, 2048}
id:1 iter:2 xyzw_i{8, 2048, 3072, 4096}
id:2 iter:2 xyzw_i{4, 2048, 3072, 4096}
id:2 iter:2 xyzw_i{8, 4096, 6144, 8192}
id:3 iter:2 xyzw_i{4, 4096, 6144, 8192}
id:3 iter:2 xyzw_i{8, 8192, 12288, 16384}
id:0 iter:3 xyzw_i{8, 8192, 12288, 16384}
id:0 iter:3 xyzw_i{16, 16384, 24576, 32768}
id:1 iter:3 xyzw_i{8, 16384, 24576, 32768}
id:1 iter:3 xyzw_i{16, 32768, 49152, 65536}
id:2 iter:3 xyzw_i{8, 32768, 49152, 65536}
id:2 iter:3 xyzw_i{16, 65536, 98304, 131072}
id:3 iter:3 xyzw_i{8, 65536, 98304, 131072}
id:3 iter:3 xyzw_i{16, 131072, 196608, 262144}
id:0 iter:4 xyzw_i{16, 131072, 196608, 262144}
id:0 iter:4 xyzw_i{32, 262144, 393216, 524288}
id:1 iter:4 xyzw_i{16, 262144, 393216, 524288}
id:1 iter:4 xyzw_i{32, 524288, 786432, 1048576}
id:2 iter:4 xyzw_i{16, 524288, 786432, 1048576}
id:2 iter:4 xyzw_i{32, 1048576, 1572864, 2097152}
id:3 iter:4 xyzw_i{16, 1048576, 1572864, 2097152}
id:3 iter:4 xyzw_i{32, 2097152, 3145728, 4194304}
id:0 iter:5 xyzw_i{32, 2097152, 3145728, 4194304}
id:0 iter:5 xyzw_i{64, 4194304, 6291456, 8388608}
id:1 iter:5 xyzw_i{32, 4194304, 6291456, 8388608}
id:1 iter:5 xyzw_i{64, 8388608, 12582912, 16777216}
id:2 iter:5 xyzw_i{32, 8388608, 12582912, 16777216}
id:2 iter:5 xyzw_i{64, 16777216, 25165824, 33554432}
id:3 iter:5 xyzw_i{32, 16777216, 25165824, 33554432}
id:3 iter:5 xyzw_i{64, 33554432, 50331648, 67108864}
id:0 iter:6 xyzw_i{64, 33554432, 50331648, 67108864}
id:0 iter:6 xyzw_i{128, 67108864, 100663296, 134217728}
id:1 iter:6 xyzw_i{64, 67108864, 100663296, 134217728}
id:1 iter:6 xyzw_i{128, 134217728, 201326592, 268435456}
id:2 iter:6 xyzw_i{64, 134217728, 201326592, 268435456}
id:2 iter:6 xyzw_i{128, 268435456, 402653184, 536870912}
id:3 iter:6 xyzw_i{64, 268435456, 402653184, 536870912}
id:3 iter:6 xyzw_i{128, 536870912, 805306368, 1073741824}
id:0 iter:7 xyzw_i{128, 536870912, 805306368, 1073741824}
id:0 iter:7 xyzw_i{256, 1073741824, 1610612736, -2147483648}
id:1 iter:7 xyzw_i{128, 1073741824, 1610612736, -2147483648}
id:1 iter:7 xyzw_i{256, -2147483648, -1073741824, 0}
id:2 iter:7 xyzw_i{128, -2147483648, -1073741824, 0}
id:2 iter:7 xyzw_i{256, 0, -2147483648, 0}
id:3 iter:7 xyzw_i{128, 0, -2147483648, 0}
id:3 iter:7 xyzw_i{256, 0, 0, 0}
id:0 iter:8 xyzw_i{256, 0, 0, 0}
id:0 iter:8 xyzw_i{512, 0, 0, 0}
id:1 iter:8 xyzw_i{256, 0, 0, 0}
id:1 iter:8 xyzw_i{512, 0, 0, 0}
id:2 iter:8 xyzw_i{256, 0, 0, 0}
id:2 iter:8 xyzw_i{512, 0, 0, 0}
id:3 iter:8 xyzw_i{256, 0, 0, 0}
id:3 iter:8 xyzw_i{512, 0, 0, 0}
id:0 iter:9 xyzw_i{512, 0, 0, 0}
id:0 iter:9 xyzw_i{1024, 0, 0, 0}
id:1 iter:9 xyzw_i{512, 0, 0, 0}
id:1 iter:9 xyzw_i{1024, 0, 0, 0}
id:2 iter:9 xyzw_i{512, 2, 3, 4}
id:2 iter:9 xyzw_i{1024, 4, 6, 8}
id:3 iter:9 xyzw_i{512, 2, 3, 4}
id:3 iter:9 xyzw_i{1024, 4, 6, 8}
<<< Process finished (PID=14788). (Exit code 0)
When one of the standard xy types is shared between coroutines like this, each coroutine gets its own copy of the x element but they all seem to share the yzw elements. This behavior is surprising and given that it severely breaks one of the example programs, I'm guessing its not intended.
What's even more surprising to me is it happens even in the modified code below, where I pass in each element individually, guessing that the issue might have something to do with a shared reference. The modified code exhibits exactly the same behavior despite looking like each coroutine should create its own completely independent xyzw that shouldn't interact with the others.
So far I haven't been able to recreate this behavior with any combination of nested types and/or functions. Only coroutines in this particular style of setup. And only for the xy standard types. Classes and vectors seem to behave in sensible manners here.