(sorry, just catching up on this thread):
There are two issues here, the semantic decision and the syntax decision. On the semantic decision, the pivot point is whether you want this to be accepted, assuming the enum is resilient and has A+B cases today.
switch foo() {
case (.A, .A), (.B, .B): ...
case (.A, .B), (.B, .A): ...
unknown default: ... // or "unknown case:", or any other spelling. This section is spelling invariant.
}
The question is whether it is desirable to allow this or not. Jordan is of the opinion that allowing such a thing is potentially confusing and should be disallowed: the only unknown case construct that should be allowed is if you're switching on an enum directly.
I'm pretty strongly of the opinion that there is no possibility of confusion here - this is simple composition on the behavior of default. I'm also pretty strongly of the opinion that making switch start to have magic behavior for one form of pattern is unprecedented and a bad idea. In my perspective, we should allow this, because in addition to tuple patterns (shown above) we support paren patterns and hope to support additional patterns in the future (e.g. potentially general nominal type destructuring), and enums can occur in nested positions.
Nested patterns with resilient enums in them would be obscure, but that is what also make the value of preventing them tiny, even if preventing them was decided to be a good thing.
Once we decide on the semantic direction, the syntax decision sort of falls out. If you follow Jordan's model, we've decided that "switch over enums" is a special form with special behavior and there is somewhat stronger argument to provide (currently unprecedented) new grammar productions for "case", given that this is a new control flow form. While "unknown case:" still doesn't make sense to me, the argument that this is a special kind of control flow statement makes room for the possibility of adding special forms that only occur in it, and explains why this could never make sense in if case.
If you follow my preferred design, then we're really just talking about the existing default semantics with a minor tweak to warning behavior. This argues strongly for a modifier of some sort on default (perhaps an attribute, perhaps a contextual keyword like unknown, whatever) and it strongly implies that we accept this in nested positions. In the core team discussion, it was observed that default: is just a synonym for case _: in patterns, so it would make sense to allow default as a verbose pattern specifier (allowing someone to write case default: if they really wanted). This allows default to work in nested positions just like _ currently does, and directly allows the unknown default syntax (however it is spelled) to work in nested productions, and thus in if case.
I think that there is another important meta point that is worth discussing here, around the problem of "potential for confusion" that seems to be motivating this entire discussion. Potential for confusion is an important factor in design, but in my opinion, any code using "unknown default" on a switch over a tuple or other enum-containing type will not suffer from it, even if the person reading the code didn't write it in the first place.
In my opinion, in practice the behavior of such code will either 1) be immediately clear to a reader, or 2) be immediately googlable to someone who wasn't familiar with unknown default. I don't think there is any reasonable likelihood that someone would look at the code, think they understand what it does and be wrong. Potential for confusion is not about "does everyone immediately know any syntax", it is much more of "does someone look at syntax and think they know what it does ... but are incorrect".
It perhaps isn't obvious, but there are highly precedented examples of this in Swift. This includes the much debated .. vs ... vs ..< operator discussion from the Swift 1 days. The point isn't that everyone will immediately know what ..< does, but if they encounter it and don't know what it is, then they know they don't know what it is. In contrast, people frequently encountered case 1..4 and thought they knew what it was, but were surprised when it didn't include 4. Use of ..< has defined away this problem.
Another example is the decision to allow user defined operators, and encouraging people to define new operators when they are doing something semantically different than the builtin ones. If someone encounters an <<=>> operator in someone else's code, they may not know what it is, but at least they aren't tricked into thinking it is something familiar. Compare this to the C++ design of forcing people to overload the existing set of operators, which means that you can encounter code using the + operator and have it actually be completely different than the standard ring algebra operations. The use of shift left for I/O is one egregious example of this, particularly because the precedence of it is wrong :-)
In any case, my personal preference is for simple and compositional designs that eschew special cases. I've been convinced that providing a solution for this problem is important, but I don't think it is sooo important that we'd warp the base language to solve it, introducing new control flow forms, new grammar productions, and new limitations all to prevent a perception of possible confusion in weird cases that are unlikely to arise in practice anyway.
-Chris