On 16.07.2017 05:30, Walter Bright wrote:
On 7/13/2017 5:18 PM, Andrei Alexandrescu wrote:
On 7/13/17 2:37 PM, Timon Gehr wrote:
On Thursday, 13 July 2017 at 17:25:18 UTC, Timon Gehr wrote:
Anyway, my assertion that Bottom cannot be a subtype of all other types was actually incorrect: the compiler does not need to generate code for implicit conversion from Bottom to some other type, so it can be treated as a subtype.
...

(Actually, there are some complications like the .sizeof property. Anyway, it is clear what the semantics of Bottom are, no matter whether it is subtyping or implicit conversion.)

I wonder if sizeof could be made size_t.max. -- Andrei

I thought bottom.sizeof would be 0.

0 is the obvious size for the unit type (the type with a single value, in D this is for example void[0]), as in:

struct S{
    T x;
    void[0] nothing;
}
static assert(S.sizeof == T.sizeof);

on the other hand

struct S{
   T x;
   Bottom everything;
}

turns the entire struct into an empty type. It is therefore most natural to say that Bottom.sizeof == ∞. (It's the only choice for which S.sizeof == Bottom.sizeof.)

Another way to think about it: If something of type A* converts to something of type B* without problems, then one would expect B.sizeof <= A.sizeof. This would imply that Bottom.sizeof >= size_t.max. (Because Bottom* converts to all other pointer types.)

One small issue is that one needs to avoid overflow for the size of a struct that has multiple fields where one of them is of type Bottom.

Reply via email to