On Monday, 10 July 2017 at 18:09:54 UTC, H. S. Teoh wrote:
On Sun, Jul 09, 2017 at 02:49:35PM -0400, Nick Sabalausky
(Abscissa) via Digitalmars-d wrote:
On 07/09/2017 06:51 AM, 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
> {
> }
Too indirect and verbose. An attribute or special "return
type" would just cut straight to the case.
If DIP 1009 is accepted, this would not be verbose at all:
void func()
out(false) // it even tells you it won't return
{
...
}
Plus, this has the advantage that you can specify a valid
return type for when you need to override a base class method,
e.g.:
class JitCompiler {
Code compile(string code);
}
class InvalidCompiler : JitCompiler {
override Code compile(string code) out(false) {...}
}
A Bottom type that implicitly converts to anything would also
fit the bill, granted, but does require changing the language.
The main thing I have against adding a Bottom type is that it
adds yet another built-in type to the language, which means (1)
a combinatorial explosion of existing language constructs
combined with the new type, with currently-unknown consequences
(and possibly corner cases we haven't thought of that will come
back to bite us), (2) yet another special type newcomers have
to learn with special semantics (I can already anticipate
complaints to D.learn about what's the difference between null
and bottom); (3) having to implement lots of compiler changes
to handle how this new type interacts with operators and other
types in all possible cases; (4) all of this just for something
that (a) is only rarely used, and (b) could have been easily
implemented by adding @noreturn or using existing contract
syntax without adding a whole new basic type to the language.
Honestly, I'd vote for @noreturn as the simplest, most
straightforward solution, and the only reason I'm arguing for
out{assert(0);} (or out(false) if DIP 1009 is accepted) is
because people are all up in arms about adding Gosh Yet Another
Special UDA In Addition To The Numerous Special UDAs We Already
Have Like @safe and @nogc.
+1