diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java index 4b2f32521a3b8..ded84ca44e61c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java @@ -2368,11 +2368,13 @@ public boolean isAssignable(Type t, Type s, Warner warn) { return true; break; case CLASS: - switch (unboxedType(s).getTag()) { - case BYTE: - case CHAR: - case SHORT: - return isAssignable(t, unboxedType(s), warn); + Type unboxedType = unboxedType(s); + switch (unboxedType.getTag()) { + case BYTE: + case CHAR: + case SHORT: + return !t.getTag().isStrictSubRangeOf(unboxedType(s).getTag()) && + isAssignable(t, unboxedType(s), warn); } break; } diff --git a/test/langtools/tools/javac/boxing/T6816548.java b/test/langtools/tools/javac/boxing/T6816548.java index a2f44e9963932..2a9b6fa9cff7b 100644 --- a/test/langtools/tools/javac/boxing/T6816548.java +++ b/test/langtools/tools/javac/boxing/T6816548.java @@ -53,7 +53,6 @@ public static void testShort() { public static void testByte() { final byte fb = 0; Byte b = fb; - Short s = fb; Character c = fb; } diff --git a/test/langtools/tools/javac/patterns/AssignmentBug.java b/test/langtools/tools/javac/patterns/AssignmentBug.java new file mode 100644 index 0000000000000..1b49a7f2fb721 --- /dev/null +++ b/test/langtools/tools/javac/patterns/AssignmentBug.java @@ -0,0 +1,31 @@ +/* + * @test /nodynamiccopyright/ + * @summary Assignment context does not reject widening p.c. and boxing + * @compile/fail/ref=AssignmentBug.out -XDrawDiagnostics -XDshould-stop.at=FLOW AssignmentBug.java + */ +public class AssignmentBug { + + void test() { + Integer t = (byte) 0; // error, no widening p.c. from byte to int and boxing + Short s = (byte) 0; // error, no widening p.c. from byte to short and boxing + + Byte B1 = (char)0; // ok, narrowing p.c. from char to byte and boxing when target is Byte + Byte B2 = (short)0; // ok, narrowing p.c. from short to byte and boxing when target is Byte + Character C1 = (short)0; // ok, narrowing p.c. from short to char and boxing when target is Character + Short S1 = (int)0; // ok, narrowing p.c. from int to char and boxing to Short + } + + void testWithSwitches() { + Integer i = 42; + var s1 = switch (i) { + case (byte)0 -> true; // error + default -> false; + }; + + Short s = 42; + var s2 = switch (s) { + case (byte)0 -> true; // error + default -> false; + }; + } +} diff --git a/test/langtools/tools/javac/patterns/AssignmentBug.out b/test/langtools/tools/javac/patterns/AssignmentBug.out new file mode 100644 index 0000000000000..a3ed7e6c2e25a --- /dev/null +++ b/test/langtools/tools/javac/patterns/AssignmentBug.out @@ -0,0 +1,5 @@ +AssignmentBug.java:9:21: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: byte, java.lang.Integer) +AssignmentBug.java:10:19: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: byte, java.lang.Short) +AssignmentBug.java:21:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: byte, java.lang.Integer) +AssignmentBug.java:27:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: byte, java.lang.Short) +4 errors