www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14155] New: [REG2.066] A defect in DIP29: the return value of


          Issue ID: 14155
           Summary: [REG2.066] A defect in DIP29: the return value of some
                    pure functions cannot be unique pointer
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: accepts-invalid, spec
          Severity: regression
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: k.hara.pg gmail.com

DIP29 extended language to support uniqueness. However, the definition contains
a problem.


     if function is pure, then result is the and'ing of all the arguments to
the function
By that, in some cases the implicit conversion may introduce type system breaking. Example: immutable int g; // runtime initialization, to prevent constfold on all 'g' access static this() { g = 1; } // foo has constant purity, and // its argument may appear in return value. // (== the return value is not isolated from the arguments.) // Any pure function can access immutable global data. // Therefore returning &g by using const(int)* is completely valid. const(int)* foo(const(int)* p) pure { return &g; } void main() { assert(g == 1); // By DIP29 definition, NewExpression is unique pointer. // Therefore the call of foo is deduced to unique and // it's implicitly converted to int*. int* p = foo(new int()); *p = 2; assert(g == 2); // blam! } DIP29 was implemented in 2.066, so it's a regression. --
Feb 09 2015