On Monday, 7 April 2014 at 21:02:04 UTC, Andrei Alexandrescu
wrote:
This program compiles and flag free and no cast in sight but
fails at runtime. Textbook example of unsound type design.
import std.stdio;
enum A { x = 2, y = 4 }
void main()
{
A a = A.x | A.y;
final switch (a)
{
case A.x: break;
case A.y: break;
}
}
The "|" operator converts back to an A. It shouldn't. In this
case it provides a value not only outside the enum range, but
even greater than A.max (when converted to integer).
I'm fine with "yes, it's unsound, but we wanted to do flags and
we couldn't find a better solution", but this "it's deliberate
and it's good" I just find difficult to get behind.
Andrei
Yeah, I've seen this happen before. I think we could actually
introduce a little more type safety on enums without a great deal
of breakage. It would be nice to have a final switch give you as
much of a guarantee about what it's doing as it can.