<div dir="ltr"><div>Greetings</div><div><br></div><div>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.</div>

<div><br></div><div>Thanks</div><div>- Puneet</div><div><br></div><div>$ rdmd --force -version=EMPLACE -Isrc -J.. test.d</div><div>4000</div><div>Segmentation fault (core dumped)</div><div>$ rdmd --force -Isrc -J.. test.d</div>

<div>4000</div><div><br></div><div><div><font face="courier new, monospace">struct bdd {}                                              // 01</font></div><div><font face="courier new, monospace">class Frop {                                               // 02</font></div>

<div><font face="courier new, monospace">  int[] _var;                                              // 03</font></div><div><font face="courier new, monospace">  int[] var() {                                            // 04</font></div>

<div><font face="courier new, monospace">    return _var;                                           // 05</font></div><div><font face="courier new, monospace">  }                                                        // 06</font></div>

<div><font face="courier new, monospace">  this() {                                                 // 07</font></div><div><font face="courier new, monospace">    this._var.length = 1;                                  // 08</font></div>

<div><font face="courier new, monospace">  }                                                        // 09</font></div><div><font face="courier new, monospace">}                                                          // 10</font></div>

<div><font face="courier new, monospace">class Foo {                                                // 11</font></div><div><font face="courier new, monospace">  long[] nodes;                                            // 12</font></div>

<div><font face="courier new, monospace">  Frop[] frops;                                            // 13</font></div><div><font face="courier new, monospace">  long[] table;                                            // 14</font></div>

<div><font face="courier new, monospace">  this() {                                                 // 15</font></div><div><font face="courier new, monospace">    nodes.length = 120000;                                 // 16</font></div>

<div><font face="courier new, monospace">    frops.length = 1;                                      // 17</font></div><div><font face="courier new, monospace">    frops[0] = new Frop();                                 // 18</font></div>

<div><font face="courier new, monospace">    initTable();                                           // 19</font></div><div><font face="courier new, monospace">    zoo(frops[0].var);                                     // 20</font></div>

<div><font face="courier new, monospace">  }                                                        // 21</font></div><div><font face="courier new, monospace">  void initTable() {                                       // 22</font></div>

<div><font face="courier new, monospace">    import std.stdio;                                      // 23</font></div><div><font face="courier new, monospace">    writeln(4000);                                         // 24</font></div>

<div><font face="courier new, monospace">    table.length = 40000;                                  // 25</font></div><div><font face="courier new, monospace">  }                                                        // 26</font></div>

<div><font face="courier new, monospace">  void zoo(int[] varset) {}                                // 27</font></div><div><font face="courier new, monospace">}                                                          // 28</font></div>

<div><font face="courier new, monospace">class Bar {                                                // 29</font></div><div><font face="courier new, monospace">  Foo _foo;                                                // 30</font></div>

<div><font face="courier new, monospace">  this() {                                                 // 31</font></div><div><font face="courier new, monospace">    version(EMPLACE) {                                     // 32</font></div>

<div><font face="courier new, monospace">      import std.conv, core.stdc.stdlib;                   // 33</font></div><div><font face="courier new, monospace">      enum size_t size = __traits(classInstanceSize, Foo); // 34</font></div>

<div><font face="courier new, monospace">      assert(size is 32);                                  // 35</font></div><div><font face="courier new, monospace">      void* tmp = core.stdc.stdlib.malloc(size);           // 36</font></div>

<div><font face="courier new, monospace">      if (!tmp)                                            // 37</font></div><div><font face="courier new, monospace">        throw new Exception("Memory allocation failed");   // 38</font></div>

<div><font face="courier new, monospace">      void[] mem = tmp[0..size];                           // 39</font></div><div><font face="courier new, monospace">      _foo = emplace!(Foo)(mem);                           // 40</font></div>

<div><font face="courier new, monospace">    }                                                      // 41</font></div><div><font face="courier new, monospace">    else {                                                 // 42</font></div>

<div><font face="courier new, monospace">      _foo = new Foo();                                    // 43</font></div><div><font face="courier new, monospace">    }                                                      // 44</font></div>

<div><font face="courier new, monospace">  }                                                        // 45</font></div><div><font face="courier new, monospace">}                                                          // 46</font></div>

<div><font face="courier new, monospace">void main() {                                              // 47</font></div><div><font face="courier new, monospace">  auto bar = new Bar;                                      // 48</font></div>

<div><font face="courier new, monospace">}                                                          // 49</font></div></div><div><br></div></div>