[Issue 14629] New: Type system breaking and wrong code bugs in casting reference types to typeof(null)

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Thu May 28 20:33:18 PDT 2015


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

          Issue ID: 14629
           Summary: Type system breaking and wrong code bugs in casting
                    reference types to typeof(null)
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: accepts-invalid, diagnostic
          Severity: normal
          Priority: P1
         Component: DMD
          Assignee: nobody at puremagic.com
          Reporter: k.hara.pg at gmail.com

A cast from non-nullable reference to typeof(null) should be disallowed in type
system.

extern(C) int printf(const char*, ...);

void main()//test14093()
{
    // reference types
    class C {}                  C c;
    alias P = int*;             P p;
    alias N = typeof(null);     N n;
    alias DA = int[];           DA da;
    alias AA = int[int];        AA aa;
    alias FP = int function();  FP fp;
    alias DG = int delegate();  DG dg;

    c = new C();
    n = cast(N)c;       // problematic cast
    printf("c = %p\n", c);
    printf("n = %p\n", n);
    assert(n is null);  // fails, wrong

    p = new int(1);
    n = cast(N)p;       // problematic cast
    printf("p = %p\n", p);
    printf("n = %p\n", n);
    assert(n is null);  // fails, wrong

    //da = [1,2,3];
    //n = cast(N)da;      // e2ir: cannot cast da of type int[] to type
typeof(null)
    //printf("da = %p\n", da.ptr);
    //printf("n = %p\n", n);
    //assert(n is null);

    aa = [1:2, 3:4];
    n = cast(N)aa;      // problematic cast
    printf("aa = %p\n", aa);
    printf("n  = %p\n", n);
    assert(n is null);  // fails, wrong

    fp = () => 1;
    n = cast(N)fp;      // problematic cast
    printf("fp = %p\n", fp);
    printf("n  = %p\n", n);
    assert(n is null);  // fails, wrong

    //dg = () => 1;
    //n = cast(N)dg;      // e2ir: cannot cast dg of type int delegate() to
type typeof(null)
    //printf("dg = %p\n", dg);
    //printf("n  = %p\n", n);
    //assert(n is null);
}

Also, the "e2ir: ..." error messages should be improved.

--


More information about the Digitalmars-d-bugs mailing list