RFR: 8301025: ClassCastException in switch with generic record

Jan Lahoda jlahoda at openjdk.org
Thu Feb 2 12:11:26 UTC 2023


On Wed, 25 Jan 2023 15:11:40 GMT, Aggelos Biboudis <abimpoudis at openjdk.org> wrote:

> Add missing class bound propagation during pattern matching translation.

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java line 485:

> 483:                     cases.stream()
> 484:                          .flatMap(c -> c.labels.stream())
> 485:                          .map(l -> toLoadableConstant(l, seltype))

I believe it is a mistake to have non-erased types in the backend (after `TransTypes`). I.e. it is a mistake `TransPatterns` create a tree with non-erased type. Something like this might be a better solution:

diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java
index 57cd9671ca9..c928c7c75d1 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java
@@ -334,7 +334,7 @@ public class TransPatterns extends TreeTranslator {
             }
             JCMethodInvocation componentAccessor =
                     make.App(make.Select(convert(make.Ident(recordBinding), recordBinding.type), //TODO - cast needed????
-                             component.accessor));
+                             component.accessor)).setType(types.erasure(component.accessor.getReturnType()));
             if (deconstructorCalls == null) {
                 deconstructorCalls = Collections.newSetFromMap(new IdentityHashMap<>());
             }

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

PR: https://git.openjdk.org/jdk/pull/12200


More information about the compiler-dev mailing list