Greetings I am trying to use emplace and it is seemingly leading to memory corruption. Before I file a bug on DMD Buzilla, I want to find out if I am doing something wrong or if it is a known issue. I am using a linux box and this testcase is freaky -- if I comment out either line 20 or line 24, the segfault vanishes.
Thanks - Puneet $ rdmd --force -version=EMPLACE -Isrc -J.. test.d 4000 Segmentation fault (core dumped) $ rdmd --force -Isrc -J.. test.d 4000 struct bdd {} // 01 class Frop { // 02 int[] _var; // 03 int[] var() { // 04 return _var; // 05 } // 06 this() { // 07 this._var.length = 1; // 08 } // 09 } // 10 class Foo { // 11 long[] nodes; // 12 Frop[] frops; // 13 long[] table; // 14 this() { // 15 nodes.length = 120000; // 16 frops.length = 1; // 17 frops[0] = new Frop(); // 18 initTable(); // 19 zoo(frops[0].var); // 20 } // 21 void initTable() { // 22 import std.stdio; // 23 writeln(4000); // 24 table.length = 40000; // 25 } // 26 void zoo(int[] varset) {} // 27 } // 28 class Bar { // 29 Foo _foo; // 30 this() { // 31 version(EMPLACE) { // 32 import std.conv, core.stdc.stdlib; // 33 enum size_t size = __traits(classInstanceSize, Foo); // 34 assert(size is 32); // 35 void* tmp = core.stdc.stdlib.malloc(size); // 36 if (!tmp) // 37 throw new Exception("Memory allocation failed"); // 38 void[] mem = tmp[0..size]; // 39 _foo = emplace!(Foo)(mem); // 40 } // 41 else { // 42 _foo = new Foo(); // 43 } // 44 } // 45 } // 46 void main() { // 47 auto bar = new Bar; // 48 } // 49