RFR: JDK-8234899: Compiler reports AssertionError for conditional operator ? : and pattern matching for instanceof
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Dec 3 17:06:53 UTC 2019
I must surely have missed something because I could follow where the fix
was going (which is strange for pending jumps-related changes :-) ).
Congrats for the devious test. It's approved for me.
Maurizio
On 03/12/2019 16:37, Jan Lahoda wrote:
> Hi,
>
> Consider code like:
> boolean result = t ? true : (!(o1 instanceof String a3));
>
> When javac starts to generate "(!(o1 instanceof String a3))", there is
> the "false" jump pending. The "!" operator is generating its operand
> in the genCond mode. But, the handling for LetExpr (into which the
> pattern matching is translated) will not explicitly resolve the
> pending jump (i.e. terminate the jump right before the code for ("o1
> instanceof String a3"). But as the desugared code for "o1 instanceof
> String a3" will create a new variable, the pending jump is resolved at
> the point the variable is generated - but that is already too late.
> And hence an AssertionError, or other trouble may happen.
>
> The proposal is to resolve (terminate) the pending jumps before
> generating a LetExpr in condition mode (as is done in non-condition
> mode).
>
> A similar problem may happen for switch expressions, so the proposal
> is to resolve the jumps for switch expressions as well.
>
> Proposed webrev:
> http://cr.openjdk.java.net/~jlahoda/8234899/webrev.00/
> JBS:
> https://bugs.openjdk.java.net/browse/JDK-8234899
>
> How does this look?
>
> Thanks,
> Jan
More information about the compiler-dev
mailing list