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.