proposed @noreturn attribute

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Tue Jul 18 18:52:30 PDT 2017


On 7/18/2017 5:54 PM, Nicholas Wilson wrote:
>> There is just something fundamentally wrong with:
>>     @noreturn int foo();
> I would understand it to mean that if it were to return, foo would return an int 
> but it is undefined behaviour for foo to dynamically return.

That's the C++ behavior. I know we are all accustomed to it and hence think it 
is intuitive, but it isn't. I know I've had a hard time breaking free of this 
sort of thinking, having been so deeply immersed in C++ for so long.


>> returning a value yet not returning. It smacks of "the language designer(s) 
>> are idiots." It winds up complicating things like:
>>
>>     auto x = a ? b : foo();
>>
>> What is the type of x? @noreturn means a special case. A proper bottom type 
>> means it is not a special case.
> 
> int.

And if b is of type `T`? It doesn't make sense to have to give a type to 
something that does not return. (@noreturn functions are usually typed as 
returning `void` anyway, but that still doesn't make much sense.)

I know how noreturn attributes work - I implemented them decades ago in DMC and 
DMC++. They are supported by the DMD optimizer and back end.

But they are a hack to the type system, and I suggest an unnecessary one.

The backends for DMD, LDC and GDC would not be affected at all by the addition 
of a bottom type to the front end, and it would be trivial for the glue code to 
add the noreturn attribute for functions that return the bottom type.


More information about the Digitalmars-d mailing list