It's unclear whether your "some remainder" is allowed to be empty. (There was
some discussion earlier about outlawing 'default' in the equivalent of a sealed switch.)
I hope full totality is fine—an expression switch, implicitly 'sealed', of course permits
a 'default' clause.
Yes, remainder can be empty. The key aspect of sealed switches is that
we generate code to handle the remainder. Of course, it could be
handled explicitly too, in which case the synthetic handler is never
matched. For example:
sealed switch (foo ) {
case Foo(var x): ...
}
is total on Foo with remainder { null }. So sealing will cause us to
throw on null. OTOH, you could also say:
sealed switch (foo ) {
case null: haha(); break;
case Foo(var x): ...
}
The compiler does not need to analyze the cases that might match
remainder; it just generates code at the end of the switch so that, if a
previous case doesn't cover it, the catch-all does.
And then note that, given the existence of 'sealed switch', the 'default Object
o' feature is redundant. If you want to make sure you have a total case in your
switch, just say 'sealed' at the top. All sealed switches (both statement and
expression) guarantee either optimistic totality + NPE or that the last clause
is total.
Yes, that's right. If there's a way to ask for totality, you can
safely use a total pattern without `default`. So `default`, in this
model, reverts to being `case _`, which is a fine role for default in
this new world.