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].

Reply via email to