[jdk17] Integrated: 8270151: IncompatibleClassChangeError on empty pattern switch statement case

Jan Lahoda jlahoda at openjdk.java.net
Fri Jul 9 11:07:20 UTC 2021

Consider code like:

sealed interface I {}
final class A implements I {}
I i = null;
switch (i) {
     case A a:

The switch is exhaustive, and javac must generate a synthetic default clause throwing an `IncompatibleClassChangeError` for the case where the permitted classes for I changes. The default clause is generated at the end of the switch statement, and consequently the execution will fall through from `case A a:` to this synthetic default, causing the `IncompatibleClassChangeError` for a valid input. (Note this was not a problem for switch expressions, as the last case can never complete normally for a switch expression.)

This PR proposes to put the synthetic default at the beginning of the switch statement, rather than at the end, which should avoid fall-through issues. An alternative solution would be to generate a synthetic break into the last case, but that is a bit tricky, so placing the default at the beginning seems more reliable to me.


Commit messages:
 - Generate synthetic breaks at the beginning of switches rather than at the end, to avoid issues if the statements in the last case complete normally.

Changes: https://git.openjdk.java.net/jdk17/pull/237/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk17&pr=237&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8270151
  Stats: 24 lines in 3 files changed: 21 ins; 0 del; 3 mod
  Patch: https://git.openjdk.java.net/jdk17/pull/237.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk17 pull/237/head:pull/237

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

More information about the compiler-dev mailing list