I am concerned about the treatment of 'break' statements in switch expressions. 
The following seems like something that would be very natural to do:

boolean x = switch (expr()) {
    case FOO -> {
        for (String s : strings) {
            if (s.isEmpty()) break false;
        }
        break true;
    }
    case BAR -> true;
    default -> false;
};

This is specified as a compiler error, even though the intent is clear, and we 
allow code of this shape in other contexts (compare, e.g., a method body).

I think what prompted this degree of brittleness is worries about ambiguity 
between label breaks and value breaks. Let me suggest this disambiguation 
strategy instead (in the spirit of 6.5.2):
- If an unqualified name appears immediately after a 'break' and occurs in the 
scope of a label with that name, it is a LabelName
- Otherwise, it is an ExpressionName

(In practice, I expect it to be rare for a real ambiguity to exist between a 
label name and a variable name.)

With that disambiguation rule in place, we can then treat value breaks much 
like label breaks:

"If no switch expression in the immediately enclosing method, constructor, 
initializer, or lambda body contains the break statement, a compile-time error 
occurs."

(No special rule about appearing inside a 'while', 'for', etc.)

Reply via email to