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


Hi,

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) {
              default:
                  break "";
                  System.err.println(0);
          };
      }
}
---

This produces:
---
$ javac --enable-preview --source 12 SE.java
SE.java:6: error: unreachable statement
                  System.err.println(0);
                  ^
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 
ExpressionSwitchUnreachable.out.)

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!

Thanks,
     Jan


More information about the compiler-dev mailing list