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