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