bottom type as parameter or local variable, does that make sense?

Paul Backus snarwin at gmail.com
Mon Jan 17 00:32:37 UTC 2022


On Sunday, 16 January 2022 at 22:56:44 UTC, Max Samukha wrote:
> On Saturday, 15 January 2022 at 18:35:02 UTC, Paul Backus wrote:
>>
>> Technically, a variable is a name associated with a block of 
>> memory, which may or may not contain a value. In the case of 
>> `noreturn`, the block of memory has size 0, and there are no 
>> possible values it can contain.
>
> Memory of size 0 contains a single value, which is the value of 
> the unit type, 0-tuple, or whatever. Zero type is different. 
> Timon, I am totally confused, could you clarify?

Unit type = size 0, 1 possible value.
Bottom type = size 0, 0 possible values.

The reason there are 0 possible values is because it is the 
bottom type, not because its size is 0.

>> So, technically, a `noreturn` variable is impossible to 
>> initialize. But since the compiler knows that the behavior of 
>> the program can't possibly depend on the variable's value, it 
>> is free to just skip the initialization altogether and leave 
>> the variable uninitialized instead.
>
> Sounds like "alias x = noreturn.init;"

You can't `alias` an expression, so the above is ill-formed.

>> I guess you could make an argument that you should have to 
>> write `noreturn x = void;` every time you declare a `noreturn` 
>> variable. But even then, it would not be correct for `noreturn 
>> x;` to result in an `assert(0)` at runtime--it would have to 
>> be a *compile-time* error.
>
> I think it depends on the definition of local declaration. For 
> statics, it is obviously a compile-time error. For locals, my 
> feeling is it should be a runtime error, but who knows. Timon, 
> help.

It would be a compile-time error for essentially the same reason 
that default-initializing a type with a @disabled default 
constructor is a compile-time error: you have asked the compiler 
to do something that it knows, at compile time, is impossible to 
do.

I think maybe the misconception that is leading you astray here 
is that you assume that "default-initializing a variable of type 
`T`" requires "evaluating the expression `T.init`". It does not. 
What default-initializing a variable of type `T` requires is

1. Determining the in-memory representation of `T`'s default 
value.
2. Arranging for that representation to be placed in the 
variable's memory at the start of its lifetime.

In the case of `noreturn`, the in-memory representation is 
"nothing", because `noreturn` has no default value (nor any other 
values), and arranging for that representation to be placed in 
the appropriate memory is either impossible or a no-op (depending 
on how you view things), because there is nothing to place and no 
memory to place it in.


More information about the Digitalmars-d mailing list