On Wednesday, 25 February 2015 at 20:15:10 UTC, anonymous wrote:
On Wednesday, 25 February 2015 at 19:32:50 UTC, Namespace wrote:
----
void glCheck(lazy void func, string file = __FILE__, uint line
= __LINE__) {
func();
glCheckError(file, line);
}
----
How can I specify that 'func' is @nogc? Or can define the
function otherwise?
First of all, if glCheck always uses/evaluates func, then there
is no point in making it lazy.
On to the @nogc vs. lazy issue.
Simpler test case:
---
void glCheck(scope lazy int thing) @nogc {auto x = thing;}
int costly() @nogc {return 42;}
void main() @nogc
{
glCheck(costly()); /* A */
int x; glCheck(x); /* B */
}
---
I guess, the compiler could see that the delegate made for the
lazy parameter must be @nogc. But it doesn't. So it tries to
call a non-@nogc delegate in a @nogc function which fails of
course.
You can make the delegate explicit so that you can tag the
delegate as @nogc yourself:
---
void glCheck(scope int delegate() @nogc thing) @nogc {auto x =
thing();}
int costly() @nogc {return 42;}
void main() @nogc
{
glCheck(()=>costly());
int x; glCheck(()=>x);
}
---
The calls are not as nice, requiring an explicit delegate
("()=>"), but it works.
It may be possible to hack through this limitation - NOT
THOUGHT-OUT, NOT TESTED, NOT RECOMMENDED:
---
void glCheck(scope lazy int thing) @nogc;
pragma(mangle, glCheck.mangleof) void glCheckImpl(scope int
delegate() @nogc thing) @nogc {auto x = thing();}
int costly() @nogc {return 42;}
void main() @nogc
{
glCheck(costly());
int x; glCheck(x);
}
---
That last thing works. But I have no clue why. o.O
Anyway, thanks a lot!