proposed @noreturn attribute
Meta via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jul 9 14:45:10 PDT 2017
On Sunday, 9 July 2017 at 21:32:31 UTC, Walter Bright wrote:
> On 7/9/2017 1:24 PM, Meta wrote:
>> Another case that we should probably just statically disallow:
>>
>> alias ImmutableBottom = immutable Bottom; //Ditto for shared,
>> const, etc.
>>
>> This obviously doesn't make any sense anyway.
>
>
>
> Wouldn't `immutable(Bottom)` simply resolve to `Bottom`?
I was thinking about that (and in fact, making Bottom a "viral"
type in the same way that NaN is a viral value), but it's not
really worth it and we might as well make it an error. It can't
occur in any template code if we disallow passing Bottom as a
template argument, e.g., the following would fail:
alias Pointificate(T) = T*;
alias Immutable(T) = immutable T;
//Error: cannot pass Bottom as a template type argument
alias PointerToBottom = Pointificate!Bottom;
alias ImmutableBottom = Immutable!Bottom;
So the only place left where we could make a modified Bottom type
would be doing `alias Immutable Bottom = immutable Bottom` and
the like. It doesn't really matter either way, I don't think, but
we might as well keeps things streamlined and just disallow
everything to do with Bottom that we don't like. Unless there's a
compelling reason to be able to apply immutable, shared, etc. to
Bottom (and I don't see how there can be as you can never have a
value of type Bottom that could be immutable, shared, etc.
anyway) we should just disallow it.
Some functional languages do allow you to create things like
`Either!(T, Bottom)` (from the Reddit thread: "Sometimes you have
a generic procedure over a sum type and you want to pass it a
single thing: `Either a Bottom` is isomorphic to a.") but I don't
see a reason for us to ever need to do that.
More information about the Digitalmars-d
mailing list