Bug 18556 – alias this breaks emplace

Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
x86_64
OS
Windows
Creation time
2018-03-05T05:42:39Z
Last change time
2019-12-03T10:00:45Z
Assigned to
No Owner
Creator
KytoDragon

Comments

Comment #0 by kytodragon — 2018-03-05T05:42:39Z
Given the following example: module test.test; import core.stdc.stdlib : malloc; import std.conv : emplace; class Bar { } class Foo { Bar bar; alias bar this; } void main() { Foo foo = NewC!Foo(); } T NewC(T, A...)(A args) { size_t size = __traits(classInstanceSize, T); void* ptr = malloc(size); import core.memory : GC; GC.addRange(ptr, size); T res = emplace!(T, A)(ptr[0..size], args); return res; } Will result in the following stacktrace once started: Segfault! Tried to write to 0x0000000000000000 d_test.exe!memcpy() Line 165 (f:\dd\vctools\crt\vcruntime\src\string\amd64\memcpy.asm:165) d_test.exe!std.conv.emplace!(test.test.Foo).emplace.__lambda3() Line 4502 (c:\D\ldc2\import\std\conv.d:4502) d_test.exe!std.conv.emplace!(test.test.Foo).emplace() Line 4529 (c:\D\ldc2\import\std\conv.d:4529) d_test.exe!std.conv.emplace!(test.test.Foo).emplace() Line 4604 (c:\D\ldc2\import\std\conv.d:4604) d_test.exe!test.test.NewC!(test.test.Foo).NewC() Line 22 (c:\Users\XXXXXX\Entwicklung\D\D_Template\source\test\test.d:22) d_test.exe!D main() Line 14 (c:\Users\XXXXXX\Entwicklung\D\D_Template\source\test\test.d:14) d_test.exe!_d_run_main�() (Unknown Source:0) d_test.exe!__entrypoint.main() Line 8 (c:\Users\XXXXXX\Entwicklung\D\D_Template\__entrypoint.d:8) [Inline Frame] d_test.exe!invoke_main() Line 64 (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:64) d_test.exe!__scrt_common_main_seh() Line 253 (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253) kernel32.dll!00000000772e59cd() (Unknown Source:0) ntdll.dll!000000007754383d() (Unknown Source:0) Reproduced using LDC 1.7.0 on Windows 7 x64 and 10 x64, both x86 and x64 builds. Unable to reproduce using DMD v2.075.0. Issue 2605 for LDC2 says broken since v2.077.0. Removing the "alias bar this;" line fixes it.
Comment #1 by bugzilla — 2019-12-03T10:00:45Z
Works with latest dmd. (Didn't work on linux with older version too.)