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)`).

Reply via email to