JDK-8212982: Rule cases in switch expression accepted even if complete normally

Jan Lahoda jan.lahoda at oracle.com
Tue Nov 20 17:14:35 UTC 2018


Bug: https://bugs.openjdk.java.net/browse/JDK-8212982

The issue here is that javac accepts switch expressions that complete 
normally without providing a value, which is not correct. A (simpler) 
fix is to enhance Flow with the necessary checks + enhancements to place 
the errors at a good place.

Webrev: http://cr.openjdk.java.net/~jlahoda/8212982/webrev.00/

This patch has a problem in cases like:
public class SE {
      private String t(int i) {
          return switch (i) {
                  break "";

This produces:
$ javac --enable-preview --source 12 SE.java
SE.java:6: error: unreachable statement
SE.java:7: error: switch expression completes without providing a value
   (switch expressions must either provide a value or throw for all 
possible input values)

The second error is caused by the first one (Flow will reset "alive" to 
"true" when reporting the "unreachable statement" error as an error 
recovery). A patch that changes the "alive" field to be tri-state 
(ALIVE, NOT_ALIVE, RECOVERY) so that it can suppress the second error in 
case of this recovery is here:

Webrev 2: http://cr.openjdk.java.net/~jlahoda/8212982/webrev.00b/

(The only differences between the patches are in the Flow.java and 

This is longer, but I think it provides better errors, so I'd prefer 
this patch, but I am also fine with the first one.

Any feedback is welcome!


More information about the compiler-dev mailing list