<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>