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

Reply via email to