proposed @noreturn attribute
Patrick Schluter via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jul 10 12:11:06 PDT 2017
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
More information about the Digitalmars-d
mailing list