Apparently global gets overwritten when the synchronized block is entered in the following code: import std.stdio; void doSynchronized() { stderr.writeln("In doSynchronized() 1: ", cast(void*) global); synchronized { stderr.writeln("In doSynchronized() 2: ", cast(void*) global); } } __gshared Object global; void main() { auto local = new Object; global = local; stderr.writeln("In main() 1: ", cast(void*) global, '\t', cast(void*) local); doSynchronized(); stderr.writeln("In main() 2: ", cast(void*) global, '\t', cast(void*) local); } Output: In main() 1: 7F4E605D8E70 7F4E605D8E70 In doSynchronized() 1: 7F4E605D8E70 In doSynchronized() 2: 0 In main() 2: 0 7F4E605D8E70 Happens only in 64-bit mode. -O, -inline and -release flags seem to be irrelevant.
https://github.com/D-Programming-Language/dmd/commit/8b008da60a01bb11721943f92dffe2cf38ea1a3d https://github.com/D-Programming-Language/dmd/commit/2adc2e2e34a625324fe2e45d43e4d7ae84299291
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル