On 7/31/18 3:17 AM, Shachar Shemesh wrote:
I'm trying to figure out what's the signature of the built-in assert. It
does not seem that I can define a similar function myself.
First attempt:
void myAssert(bool cond, string msg) @nogc nothrow;
No, because msg gets evaluated unconditionally.
void myAssert(bool cond, lazy string msg) @nogc nothrow;
test.d(8): Error: @nogc function test.myAssert cannot call non-@nogc
delegate msg
Hm... I would say compiler should be smart enough to know that lazy
string messages that are not @nogc shouldn't be able to be passed in here.
e.g.:
myAssert(a == b, "a and b should be equal); // ok
myAssert(a == b, a.name ~ " and " ~ b.name ~ " should be equal"); // error
It appears that lazy is not inferring anything, it's strictly
transformed into a normal delegate. I'd say at least the template
solution should be made to work.
-Steve