[Issue 14648] DIP25's "return" attribute breaks safety checks

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Jun 6 22:34:23 PDT 2016


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

Walter Bright <bugzilla at digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla at digitalmars.com

--- Comment #1 from Walter Bright <bugzilla at digitalmars.com> ---
The code in question:

// rdmd -unittest -main -dip25 dip25.d 

private struct Container 
{ 
    this(int c) @safe 
    { 
        arr = new int[](c); 
        arr[] = c; 
    } 

     ~this() @safe 
     { 
         arr[] = -1; 
     } 

     ref Range opSlice() return @safe // remove "return" and this code
correctly fails to compile 
     { 
         r.index = 0; 
         r.c = &this; 
         return r; 
     } 

     @safe struct Range 
     { 
         int front() { return c.arr[index]; } 
         bool empty() { return index >= c.arr.length; } 
         void popFront() { index++; } 
         size_t index; 
         Container* c; 
     } 

 private: 
     Range r; 
     int[] arr; 
 } 

 private struct S 
 { 
     void takesContainer(ref Container c) @safe 
     { 
         this.r = c[]; 
     } 

     void print() @safe 
     { 
         import std.stdio:writeln; 
         writeln(r); 
     } 

     Container.Range r; 
 } 

 void doStuff(ref S s) @safe 
 { 
     auto c = Container(20); 
     s.takesContainer(c); 
 } 

 @safe unittest 
 { 
     S s; 
     doStuff(s); 
     s.print(); 
 }

--


More information about the Digitalmars-d-bugs mailing list