On 7/9/17 7:26 AM, Steven Schveighoffer wrote:
On 7/9/17 7:07 AM, Nicholas Wilson wrote:
On Sunday, 9 July 2017 at 10:59:43 UTC, Steven Schveighoffer wrote:
On Sunday, 9 July 2017 at 10:51:50 UTC, Daniel N wrote:
On Sunday, 9 July 2017 at 10:31:47 UTC, Mr.D wrote:
On Saturday, 8 July 2017 at 10:15:39 UTC, Walter Bright wrote:

Has anyone a better idea?

What about

scope(exit) assert(0);

?

void func()
out { assert(0); }
body
{
}

Yes, this!

That certainly signals intention, but I still think that an attribute is a whole lot simpler than compiler voodoo like this or the "None" discussed earlier.

This whole proposal is compiler voodoo :)

Unlike a currently undefined attribute, assert(0) in the out contract currently is effective to mean no return. It also guarantees that if there is a return statement somewhere, it still doesn't return.

Also, since the out contract is part of the signature, it will still be present in the case of separate compilation.

The one disadvantage, is that -release removes contracts. So in this particular case, the out contract should remain.

Not sure if it has been mentioned yet, but @disable(return) could work as something that doesn't add any new attributes.

I wonder why there's so much attraction to exotic approaches when encoding "no return" with types has so much established theory and practice with it. -- Andrei

Reply via email to