diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java index 66de5203d57..da0e3f9c747 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java @@ -2974,10 +2974,10 @@ public class Lower extends TreeTranslator { // preserving the side effects of the value VarSymbol dollar_s = new VarSymbol(FINAL | SYNTHETIC, names.fromString("tmp" + tree.pos + this.target.syntheticNameChar()), - tree.expr.type, + types.erasure(tree.expr.type), currentMethodSym); JCStatement var = make.at(tree.pos()) - .VarDef(dollar_s, instanceOfExpr).setType(dollar_s.type); + .VarDef(dollar_s, instanceOfExpr); if (types.isUnconditionallyExact(tree.expr.type, tree.pattern.type)) { exactnessCheck = make.Literal(BOOLEAN, 1).setType(syms.booleanType.constType(1)); diff --git a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithRecordPatterns.java b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithRecordPatterns.java index 0c22c987f6c..dce025a0708 100644 --- a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithRecordPatterns.java +++ b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithRecordPatterns.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8304487 + * @bug 8304487 8327683 8330387 * @summary Compiler Implementation for Primitive types in patterns, instanceof, and switch (Preview) * @enablePreview * @compile PrimitiveInstanceOfPatternOpWithRecordPatterns.java @@ -42,6 +42,7 @@ public class PrimitiveInstanceOfPatternOpWithRecordPatterns { assertEquals(true, unboxingWithObject()); assertEquals(true, wideningReferenceConversionUnboxing()); assertEquals(true, wideningReferenceConversionUnboxing2()); + assertEquals(true, wideningReferenceConversionUnboxing3()); assertEquals(true, wideningReferenceConversionUnboxingAndWideningPrimitive()); assertEquals(true, unboxingAndWideningPrimitiveExact()); assertEquals(false, unboxingAndWideningPrimitiveNotExact()); @@ -114,6 +115,11 @@ public class PrimitiveInstanceOfPatternOpWithRecordPatterns { return i instanceof R_generic2(byte _); } + public static boolean wideningReferenceConversionUnboxing3() { + R_generic i = new R_generic(0x1000000); + return i instanceof R_generic(float _); + } + public static boolean wideningReferenceConversionUnboxingAndWideningPrimitive() { R_generic i = new R_generic(42); return i instanceof R_generic(double _); diff --git a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithTopLevelPatterns.java b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithTopLevelPatterns.java index 545c2482825..5c6d3e6361d 100644 --- a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithTopLevelPatterns.java +++ b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfPatternOpWithTopLevelPatterns.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8304487 8325257 + * @bug 8304487 8325257 8327683 8330387 * @summary Compiler Implementation for Primitive types in patterns, instanceof, and switch (Preview) * @enablePreview * @compile PrimitiveInstanceOfPatternOpWithTopLevelPatterns.java @@ -44,6 +44,7 @@ public class PrimitiveInstanceOfPatternOpWithTopLevelPatterns { assertEquals(true, unboxingWithObject()); assertEquals(true, wideningReferenceConversionUnboxing(42)); assertEquals(true, wideningReferenceConversionUnboxing2(Byte.valueOf((byte) 42))); + assertEquals(true, wideningReferenceConversionUnboxing3(0x1000000)); assertEquals(true, wideningReferenceConversionUnboxingAndWideningPrimitive(42)); assertEquals(true, unboxingAndWideningPrimitiveExact()); assertEquals(false, unboxingAndWideningPrimitiveNotExact()); @@ -121,6 +122,10 @@ public class PrimitiveInstanceOfPatternOpWithTopLevelPatterns { return i instanceof byte bb; } + public static boolean wideningReferenceConversionUnboxing3(T i) { + return i instanceof float ff; + } + public static boolean wideningReferenceConversionUnboxingAndWideningPrimitive(T i) { return i instanceof double ii; } diff --git a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfTypeComparisonOp.java b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfTypeComparisonOp.java index 7110d2b2d8f..47686c98a42 100644 --- a/test/langtools/tools/javac/patterns/PrimitiveInstanceOfTypeComparisonOp.java +++ b/test/langtools/tools/javac/patterns/PrimitiveInstanceOfTypeComparisonOp.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8304487 8325257 + * @bug 8304487 8325257 8327683 8330387 * @summary Compiler Implementation for Primitive types in patterns, instanceof, and switch (Preview) * @enablePreview * @compile PrimitiveInstanceOfTypeComparisonOp.java @@ -44,6 +44,7 @@ public class PrimitiveInstanceOfTypeComparisonOp { assertEquals(true, unboxingWithObject()); assertEquals(true, wideningReferenceConversionUnboxing(42)); assertEquals(true, wideningReferenceConversionUnboxing2(Byte.valueOf((byte) 42))); + assertEquals(true, wideningReferenceConversionUnboxing3(0x1000000)); assertEquals(true, wideningReferenceConversionUnboxingAndWideningPrimitive(42)); assertEquals(true, unboxingAndWideningPrimitiveExact()); assertEquals(false, unboxingAndWideningPrimitiveNotExact()); @@ -121,6 +122,10 @@ public class PrimitiveInstanceOfTypeComparisonOp { return i instanceof byte; } + public static boolean wideningReferenceConversionUnboxing3(T i) { + return i instanceof float; + } + public static boolean wideningReferenceConversionUnboxingAndWideningPrimitive(T i) { return i instanceof double; } diff --git a/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.java b/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.java index 72489d562ea..4186b83f2f1 100644 --- a/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.java +++ b/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.java @@ -261,4 +261,8 @@ public class PrimitivePatternsSwitchErrors { case char c -> c; // Error - not exhaustive and not allowed }; } + + public static boolean wideningReferenceConversionUnboxingAndNarrowingPrimitive(T i) { + return i instanceof byte b; // not allowed as a conversion + } } diff --git a/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.out b/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.out index 22178944b7c..1cbf288e774 100644 --- a/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.out +++ b/test/langtools/tools/javac/patterns/PrimitivePatternsSwitchErrors.out @@ -29,6 +29,7 @@ PrimitivePatternsSwitchErrors.java:216:18: compiler.err.prob.found.req: (compile PrimitivePatternsSwitchErrors.java:248:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.lang.Long, char) PrimitivePatternsSwitchErrors.java:255:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.lang.Long, int) PrimitivePatternsSwitchErrors.java:261:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.lang.Short, char) +PrimitivePatternsSwitchErrors.java:266:16: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: T, byte) PrimitivePatternsSwitchErrors.java:30:16: compiler.err.not.exhaustive PrimitivePatternsSwitchErrors.java:37:16: compiler.err.not.exhaustive PrimitivePatternsSwitchErrors.java:44:16: compiler.err.not.exhaustive @@ -43,4 +44,4 @@ PrimitivePatternsSwitchErrors.java:254:16: compiler.err.not.exhaustive PrimitivePatternsSwitchErrors.java:260:16: compiler.err.not.exhaustive - compiler.note.preview.filename: PrimitivePatternsSwitchErrors.java, DEFAULT - compiler.note.preview.recompile -43 errors \ No newline at end of file +44 errors