[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