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

2016-06-06 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=14648

Walter Bright  changed:

   What|Removed |Added

 CC||bugzi...@digitalmars.com

--- Comment #1 from Walter Bright  ---
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(); 
 }

--


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

2016-06-18 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=14648

Walter Bright  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |WORKSFORME

--- Comment #2 from Walter Bright  ---
It compiles and prints:

[]

for me with any combination of -dip25 or not.

--