On Thursday, 18 February 2016 at 07:21:05 UTC, Chris Katko wrote:
Hello. I'm almost brand-new to the D language and still
absorbing things.
I'm wondering if it's possible to fire off a compile-time (or
worst case, a run-time) warning or error if a function is
called, but the return value is not checked.
I'm not trying to enforce whether someone actually deciphers
the value's meaning correctly. I just want to enforce that
somewhere, a variable or expression is receiving the return
value of a particular function.
Any ideas?
As Jonathan said, there's no such built-in feature, and exception
are preferred over return codes. However, you can implement such
a check at run time:
struct ForceCheck(T) {
private T payload;
private bool checked = false;
@disable this();
@disable this(this);
this()(auto ref T payload) { this.payload = payload; }
ref T get() {
this.checked = true;
return payload;
}
alias get this;
void ignore() {
this.checked = true;
}
~this() {
assert(this.checked, "you forgot to check the return
value");
}
}
auto forceCheck(T)(auto ref T value) {
return ForceCheck!T(value);
}
auto foo() {
return forceCheck(42);
}
void main() {
{
auto a = foo();
if(a != 42) { } // stored values
}
{
if(foo() != 42) { } // direct access
}
{
foo().ignore(); // explicitly ignore return value
}
{
auto b = foo(); // this one asserts
foo(); // as does this one
}
}
I guess it's reasonably performant; it could be optimized further
by only adding the `checked` member if assertions are enabled
(using `version(assert)`).