RFR: 8263642: javac emits duplicate checkcast for first bound of intersection type in cast

Vicente Romero vromero at openjdk.java.net
Wed Jun 2 04:47:32 UTC 2021


On Thu, 8 Apr 2021 16:29:04 GMT, Guoxiong Li <gli at openjdk.org> wrote:

> Hi all,
> 
> Before the phase `desugar`, the demo `(C1 & I1) o` has **one** type-cast sub-tree, `JCTypeIntersection C1&I1`, at the syntax tree. After the phase `desugar`, the `(C1 & I1) o` becomes **three** type-cast sub-trees: `JCTypeIntersection C1&I1`, `I1`, `C1`. So at phase `Gen`, `javac` generates **three** `checkcast` according to the **three** type-cast sub-trees which causes this bug.
> 
> This patch doesn't generate `checkcast` when the type is `JCTypeIntersection` so that the problem can be solved. And a corresponding test case is added.
> 
> Another way to solve this issue is that the `TransTypes` of  the `desugar` should be modified and **two** type-cast sub-trees should be generated instead of **three**. But this way may change more code than my original patch and may cause other regression.
> 
> Thank you for taking the time to review.
> 
> Best Regards.
> --Guoxiong

Changes requested by vromero (Reviewer).

src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java line 2225:

> 2223:            !types.isSameType(tree.expr.type, tree.clazz.type) &&
> 2224:            types.asSuper(tree.expr.type, tree.clazz.type.tsym) == null &&
> 2225:            tree.clazz.getTag() != TYPEINTERSECTION) {

I think that if the right form of the AST is one that have only two type casts, then that's what the fix should be doing

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

PR: https://git.openjdk.java.net/jdk/pull/3399


More information about the compiler-dev mailing list