www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14166] New: null dereference during CTFE

https://issues.dlang.org/show_bug.cgi?id=14166

          Issue ID: 14166
           Summary: null dereference during CTFE
           Product: D
           Version: D1 & D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: regression
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: vlevenfeld gmail.com

In the following code, I expect the pragma to output "int". When static if (1)
causes a null dereference in CTFE. Manually lowering (static if (0)) causes the
code to behave as expected.

/////

struct Proxy (T)
{
    T* ptr;

    ref deref ()
    {
        return *ptr;
    }

    alias deref this;
}

struct Test
{
    auto opIndex ()
    {
        return this;
    }
    auto opIndex (int)
    {
        return 1;
    }
}

template Elem (R)
{
    static if (0) // 0 => Elem == int; 1 => Error: dereference of null pointer
'this.ptr'
        alias Elem = typeof(R.init[][0]);
    else alias Elem = typeof(R.init[].opIndex (0));
}

void main ()
{
    alias T = Proxy!Test;
    pragma (msg, Elem!T);
}


/*
dmd git-HEAD outputs this:

source/app.d(11): Error: dereference of null pointer 'this.ptr'
source/app.d(31):        called from here: Proxy(null).deref()
source/app.d(37): Error: template instance app.Elem!(Proxy!(Test)) error
instantiating
source/app.d(37):        while evaluating pragma(msg, Elem!(Proxy!(Test)))
FAIL
.dub/build/application-debug-linux.posix-x86_64-dmd_2067-905D3FE7D130796D902AA401E263BCF6/
testing executable
Error executing command run:
dmd failed with exit code 1.

*/

--
Feb 10 2015