On 10.07.2017 04:44, Walter Bright wrote:
Let's call the bottom type 'B' for the moment, for convenience.
If we think of it like a floating point NaN,
It's not. It's an empty type.
then any type construction
of B yields a B:
const(B) -> B
I don't see why to add this special case.
B* -> B
B[] -> B
X[B] -> B
B[X] -> B
...
This would be wrong. All of the types on the left have valid values,
they are not isomorphic to B.
Since B cannot have a value, any expression that forms a B can be
replaced with an assert(0).
B foo(); // declaration
foo() -> foo(); assert(0);
Yes.
cast(B)exp -> exp; assert(0);
B b; -> assert(0);
Those wouldn't compile. (Nothing can be cast to bottom, there is no
default initializer that the variable declaration can use.)
Given a tuple of types:
alias T = tuple(B,X);
is T equivalent to which of:
B (1)
tuple(X) (2)
tuple(Y,X) (3)
tuple(B,X) (4)
? I'm leaning toward (4) as making the most sense.
...
It's the only one that makes any sense.
struct S {
T t;
}
should then yield an error, while:
struct S {
T[1..1] t; // t is of type X
}
would not.
I guess you meant T[1..2].