Skip to content

Instantly share code, notes, and snippets.

@Hackerpilot
Last active August 29, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hackerpilot/d665a0d5c80ddc163454 to your computer and use it in GitHub Desktop.
Save Hackerpilot/d665a0d5c80ddc163454 to your computer and use it in GitHub Desktop.
DIP 25 bug
// 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();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment