http://d.puremagic.com/issues/show_bug.cgi?id=4571

           Summary: Non-null class references/pointers
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nob...@puremagic.com
        ReportedBy: bearophile_h...@eml.cc


--- Comment #0 from bearophile_h...@eml.cc 2010-08-02 16:27:19 PDT ---
This is a starting point for an enhancement request about a type modifier to
specify that a class reference or pointer can't be null.

This is not an enhancement request about "nullable values" (values wrapped in a
struct that contains a boolean that is true if the value is "null").

This enhancement request assumes that on default both class references and
pointers are nullable (because today defaulting to non-null class references is
probably an impossible change in D).


A possible D syntax to denote a non-null reference or pointer is to use a @
suffix (better looking alternatives are possible):

class T {}
T nullable_reference;
T@ nonnullable_reference = new T@();

struct S {}
S nullable_pointer;
S@ nonnullable_pointer = new S@();


A possible alternative is to use the - (or +) suffix:

class T {}
T nullable_reference;
T- nonnullable_reference = new T-();

struct S {}
S nullable_pointer;
S- nonnullable_pointer = new S-();


A possible problem with non-null class references can be seen with this D
program that uses the trailing @ syntax:

class Foo {}

class A {
    Foo@ name;
    this(Foo@ s) {
        this.name = s;
        this.m();
    }

    void m() { /*...*/ }
}

class B : A {
    Foo@ path;
    this(Foo@ p, Foo@ s) {
        super(s);
        this.path = p;
    }

    override void m() {
        // here this.path is null despite it's a non-null
        assert(this.path !is null);
    }
}

void main() {
    new B(new Foo, new Foo);
}


I have adapted that example from this paper, it discusses about partially
uninitialized objects too:
http://research.microsoft.com/pubs/67461/non-null.pdf

A comment about that program from the paper:

>The problem with the code is that during the base call to A's constructor, the 
>virtual method B.m may be invoked. At this time, field path of the object 
>under construction has not yet been initialized. Thus, accesses of this.path 
>in method B.m may yield a possibly-null value, even though the field has been 
>declared as being non-null.<

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to