April 16, 2014 [Issue 12588] New: Segfault on X86_64 assigning std.complex to array | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=12588 Issue ID: 12588 Summary: Segfault on X86_64 assigning std.complex to array Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: major Priority: P1 Component: DMD Assignee: nobody@puremagic.com Reporter: kevin.lamonte@gmail.com Encountered this working on a templated matrix library at https://github.com/klamonte/eng. Here is a reduced test case: ---- import std.conv; import std.complex; import std.stdio; public class foo(T) { private T [] data; public this(size_t length, T item) { data = new T[length]; version (X86_64) { static if ((is(T == Complex!(float))) || (is(T == Complex!(double))) || (is(T == Complex!(real))) ) { for (auto i = 0; i < data.length; i++) { data[i] = to!(T)(item); } } else { data[0 .. $] = to!(T)(item); } } else { data[0 .. $] = to!(T)(item); } } } unittest { auto test = new foo!(Complex!(double))(20, Complex!(double)(3, -4)); stdout.writefln("test %s", test.data[10]); auto test2 = new foo!(float)(20, 1.23); stdout.writefln("test2 %s", test2.data[10]); } public void main() { stdout.writeln("Hello."); } ---- Normal output via 'dmd -unittest test.d -oftest ; ./test': ---- test 3-4i test2 1.23 Hello. ---- Remove the version(X86_64) guard so that the line 'data[0 .. $] = to!(T)(item);' executes when T is Complex, and the output is: ---- Segmentation fault ---- Either the 'data[0 .. $] = ...'code path is broken when the compiler emits 64-bit, or the same code path is only working accidentally on 32-bit and it should have failed to compile. I'm not 100% sure which. Also: the severity help text does not define the differences between normal, major, critical, etc. Feel free to change as needed, obviously I can workaround this issue in my code. -- |
Copyright © 1999-2021 by the D Language Foundation