www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [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.

--
Apr 16 2014