digitalmars.D.learn - Enforcing checks for return code
- Chris Katko (13/13) Feb 17 2016 Hello. I'm almost brand-new to the D language and still absorbing
- Jonathan M Davis via Digitalmars-d-learn (7/20) Feb 18 2016 D has no such feature, and very little D code is going to use return cod...
- tsbockman (41/54) Feb 18 2016 Off hand, I see two reasonable ways to do this:
- Marc =?UTF-8?B?U2Now7x0eg==?= (48/58) Feb 18 2016 As Jonathan said, there's no such built-in feature, and exception
- Chris Katko (3/10) Feb 21 2016 Thank you all for your insight. I think I have all the
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? I imagine I could use a compiler flag to warn, but that's a global setting. I'm looking more for a specified subset of functions.
Feb 17 2016
On Thursday, February 18, 2016 07:21:05 Chris Katko via Digitalmars-d-learn 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? I imagine I could use a compiler flag to warn, but that's a global setting. I'm looking more for a specified subset of functions.D has no such feature, and very little D code is going to use return codes. D has exceptions, and throwing an exception is the normal way to indicate that there was a problem. You certainly _can_ choose to use error codes if you'd like, but it's not normal practice, and the language does nothing extra to support it. - Jonathan M Davis
Feb 18 2016
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? I imagine I could use a compiler flag to warn, but that's a global setting. I'm looking more for a specified subset of functions.Off hand, I see two reasonable ways to do this: 1) Instead of actually returning the value, require the caller to pass the destination variable as a `ref` or `out` parameter. Disadvantages: This could be a bit slower than using actual return values, and it would change the syntax. 2) Wrap the return value in a struct like this: struct MustUse(T) { pure: nothrow: private: T payload; bool used; public: property ref T use() nogc { used = true; return payload; } alias use this; this(T payload) nogc { this.payload = payload; this.used = false; } ~this() { if(!used) throw new Error(T.stringof ~ " return value was not used."); } } // For convenience, use this function to infer T from the type of paylaod. MustUse!T mustUse(T)(T payload) { return MustUse!T(payload); } Example on DPaste: http://dpaste.dzfl.pl/8ba6ebf05f32 With inlining and optimizations, even the above generic implementation might be faster than passing by ref/out. A specialization for non-null pointer values could almost certainly be faster. Disadvantages: On the other hand, it might be slower. The only way to know for sure, is to write some non-trivial examples and benchmark. Regardless, the fact that it signals the error at runtime instead of compile time could be annoying.
Feb 18 2016
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)`).
Feb 18 2016
On Thursday, 18 February 2016 at 10:46:03 UTC, Marc Schütz wrote:On Thursday, 18 February 2016 at 07:21:05 UTC, Chris Katko wrote:Thank you all for your insight. I think I have all the information I need.[...]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: [...]
Feb 21 2016