bottom type as parameter or local variable, does that make sense?
Max Samukha
maxsamukha at gmail.com
Sat Feb 5 21:38:32 UTC 2022
On Monday, 17 January 2022 at 16:11:03 UTC, Timon Gehr wrote:
> On 16.01.22 23:56, 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?
>> ...
>
> I share your confusion. A block of memory of size zero indeed
> has a unique value, not zero values. I don't think there is any
> principled way to arrive at a semantics where the program
> survives an attempt to initialize a `noreturn` variable. Also,
> note that typically, if a type `A*` is a subtype of a type
> `B*`, then `A.sizeof>=B.sizeof`. `noreturn*` is a subtype of
> any `T*`. Hence, `noreturn.sizeof` should be at least
> `size_t.max` or even `∞`. Thus, `noreturn.sizeof == 0` is
> already a special case with a pragmatic justification and using
> it to attempt to justify any further behavior of `noreturn` is
> questionable in the first place.
>
>>>
>>> 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;"
>>
>>>
>>> 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.
>
> In D, types that do not have a default constructor cannot be
> default-constructed. The question is whether `noreturn`, the
> empty type, should really have a default constructor (that
> immediately terminates the program). As far as I understand,
> according to the DIP, `noreturn` has a default constructor, but
> `noreturn` variables are initialized lazily when they are
> accessed. I am not sure whether that's pragmatically the right
> choice, because it's a special case and generic code might
> check whether some type is default-constructible and only in
> this case declare a local variable of that type. At least it
> crashes at the latest possible moment, I guess. It's certainly
> a bit weird that now, in D, 0·x is not always 0.
Thanks, Timon! Don't construe the lack of a reply as disrespect.
I'm slow, uneducated and still thinking.
More information about the Digitalmars-d
mailing list