proposed @noreturn attribute
Patrick Schluter via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jul 17 10:32:53 PDT 2017
On Monday, 17 July 2017 at 15:39:30 UTC, Olivier FAURE wrote:
> On Sunday, 16 July 2017 at 20:44:13 UTC, Andrei Alexandrescu
> wrote:
>>> An issue is that we already have typeof(null). typeof(null)
>>> and typeof(assert(0))* are two ways to specify almost the
>>> same thing. One question is whether typeof(assert(0))* and
>>> typeof(null) should be the same, or if the former should not
>>> implicitly convert to class references.
>>> I have also argued in the past that there should be a
>>> separate typeof([]). This role would now be filled by
>>> typeof(assert(0))[]. However, changing the type of '[]' may
>>> break code.
>>
>> You're on to something here. Perhaps we go the inverse route
>> and define the bottom type as typeof(*null). Would that
>> simplify matters? There is some good consistency about it:
>>
>> null: a pointer to anything. But can't be dereferenced.
>> *null: well, therefore... anything. But can't be created.
>>
>> The latter is a mere consequence of the former.
>
> I'd really prefer if you avoided the whole `typeof(assert(0))`
> thing.
>
> First off, it's way too verbose for a simple concept. In
> general, code is much more readable when you can read functions
> as `Type functionName(args)`, rather than template-style
> `expr(valueof!(thing + otherThing).typeof) functionName(args)`,
> so I think it would be better not to encourage adding more
> expressions as return types.
>
> I think the following:
>
> noreturn_t logThenQuit(string message)
>
> is much more readable and obvious (especially to a beginner)
> than:
>
> typeof(*null) logThenQuit(string message)
>
> Of course, you could implement typeof(*null); and also add
> noreturn_t as an alias; it might be a good compromise; I'd
> still dislike it because it encourages people to use the
> verbose hard to understand version.
>
> The second reason I don't like it is that I feel it's just
> trying to be clever for the sake of cleverness. I don't think
> we need a language feature that perfectly matches the idea of
> not returning from a function on a deep, philosophical level;
> we just need a way to tell the type system "Hey, this function
> doesn't return!".
>
> I don't think `typeof(*null)`, or `typeof(assert(0))` brings
> any advantage in term of real life user code, and I don't think
> it's worth the confused users that would look at code and go
> "Uh? What is the type of *null?" or "I thought assert was void!
> What would you get the type of assert()?".
Yes, this!
More information about the Digitalmars-d
mailing list