On Sunday, 9 July 2017 at 11:26:27 UTC, 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.
-Steve
If the compiler is like a magician, adding an attribute is like
conjuring a rabbit, adding the "None" would be like summoning
Chthulu.
I like the @disable(return) but I still think a plain attribute
is the simplest way to achieve the goals of:
* documentation, is doesn't get much simpler than @noreturn
* optimisation, its already in LDC and GDC, just under a
different name
* compatibility between compilers, its as simple as an alias in a
version statement per compiler.