[jdk17] RFR: 8268871: Adjust javac to updated exhaustiveness specification

Jan Lahoda jlahoda at openjdk.java.net
Wed Jun 16 12:54:46 UTC 2021


The current updates spec for pattern matching in switch:
http://cr.openjdk.java.net/~gbierman/jep406/jep406-20210608/specs/patterns-switch-jls.html

tweaks the definition of exhaustive switches so that it include handling special types, like intersection types, sealed subclasses of sealed types, like:

sealed abstract class A permits B, C {}
final class B extends A {}
sealed abstract class C extends A permits D, E {}
final class D extends C {}
final class E extends C {}

public class Test {
  public static void main(String[] args) {
     A a = new D();
     System.out.println(
        switch (a) {
           case B x -> "B";
           case D x -> "D";
           case E x -> "E";
        });
  }
}


etc. This patch attempts to tweak javac to work according to this specification. It builds covered types based on what types are covered, i.e. if all subtypes of a sealed type are covered, the sealed type itself is covered, and this is done transitively, so that in the example above, `D` and `E` will mark `C` as covered, and then `B` and `C` will mark `A` as covered, and as the type if `a` is `A`, it means the switch is exhaustive.

-------------

Commit messages:
 - 8268871: Adjust javac to updated exhaustiveness specification

Changes: https://git.openjdk.java.net/jdk17/pull/78/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk17&pr=78&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8268871
  Stats: 264 lines in 2 files changed: 190 ins; 62 del; 12 mod
  Patch: https://git.openjdk.java.net/jdk17/pull/78.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk17 pull/78/head:pull/78

PR: https://git.openjdk.java.net/jdk17/pull/78


More information about the compiler-dev mailing list