c4557a7b0d
Reviewed-by: vromero
269 lines
6.8 KiB
Java
269 lines
6.8 KiB
Java
/*
|
|
* @test /nodynamiccopyright/
|
|
* @bug 8304487 8325653 8332463
|
|
* @summary Compiler Implementation for Primitive types in patterns, instanceof, and switch (Preview)
|
|
* @enablePreview
|
|
* @compile/fail/ref=PrimitivePatternsSwitchErrors.out -XDrawDiagnostics -XDshould-stop.at=FLOW PrimitivePatternsSwitchErrors.java
|
|
*/
|
|
public class PrimitivePatternsSwitchErrors {
|
|
record R_int(int x) {}
|
|
|
|
public static void dominationBetweenPrimitivePatterns() {
|
|
int i = 42;
|
|
switch (i) {
|
|
case short s -> System.out.println("its a short");
|
|
case byte b -> System.out.println("its a byte"); // Error - dominated!
|
|
default -> System.out.println("any other integral value");
|
|
}
|
|
}
|
|
|
|
public static int dominationWithRecordPatterns() {
|
|
R_int r = new R_int(42);
|
|
return switch (r) {
|
|
case R_int(int x) -> 1;
|
|
case R_int(byte x) -> 2; // Error - dominated!
|
|
};
|
|
}
|
|
|
|
public static int inconvertibleNestedComponent() {
|
|
R_int r = new R_int(42);
|
|
return switch (r) {
|
|
case R_int(Long x) -> 1; // inconvertible
|
|
};
|
|
}
|
|
|
|
public static int nonExhaustive1() {
|
|
int i = 42;
|
|
return switch (i) { // Error - not exhaustive
|
|
case short s -> s;
|
|
};
|
|
}
|
|
|
|
public static int nonExhaustive2() {
|
|
int i = 42;
|
|
return switch (i) { // Error - not exhaustive
|
|
case byte b -> 1;
|
|
case short s -> 2;
|
|
};
|
|
}
|
|
|
|
public static int nonExhaustive3() {
|
|
int i = 42;
|
|
return switch (i) { // Error - not exhaustive
|
|
case byte b -> 1;
|
|
case float f -> 2;
|
|
};
|
|
}
|
|
|
|
public static int dominationBetweenBoxedAndPrimitive() {
|
|
int i = 42;
|
|
return switch (i) {
|
|
case Integer ib -> ib;
|
|
case byte ip -> ip; // OK - not dominated!
|
|
};
|
|
}
|
|
|
|
public static int constantDominatedWithPrimitivePattern() {
|
|
int i = 42;
|
|
return switch (i) {
|
|
case int j -> 42;
|
|
case 43 -> -1; // Error - dominated!
|
|
};
|
|
}
|
|
|
|
public static int constantDominatedWithFloatPrimitivePattern() {
|
|
float f = 42.0f;
|
|
return switch (f) {
|
|
case Float ff -> 42;
|
|
case 43.0f -> -1; // Error - dominated!
|
|
};
|
|
}
|
|
|
|
void switchLongOverByte(byte b) {
|
|
switch (b) {
|
|
case 0L: return ;
|
|
}
|
|
}
|
|
|
|
void switchOverPrimitiveFloatFromInt(float f) {
|
|
switch (f) {
|
|
case 16777216:
|
|
break;
|
|
case 16777217:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void switchOverNotRepresentableFloat(Float f) {
|
|
switch (f) {
|
|
case 1.0f:
|
|
break;
|
|
case 0.999999999f:
|
|
break;
|
|
case Float fi:
|
|
break;
|
|
}
|
|
}
|
|
|
|
int switchOverPrimitiveBooleanExhaustiveWithNonPermittedDefault(boolean b) {
|
|
return switch (b) {
|
|
case true -> 1;
|
|
case false -> 2;
|
|
default -> 3;
|
|
};
|
|
}
|
|
|
|
int switchOverPrimitiveBooleanExhaustiveWithNonPermittedDefaultStatement(boolean b) {
|
|
switch (b) {
|
|
case true: return 1;
|
|
case false: return 2;
|
|
default: return 3;
|
|
}
|
|
}
|
|
|
|
int switchOverPrimitiveBooleanExhaustiveWithNonPermittedUnconditionalStatement(boolean b) {
|
|
switch (b) {
|
|
case true: return 1;
|
|
case false: return 2;
|
|
case boolean bb: return 3; // error
|
|
}
|
|
}
|
|
|
|
void switchCombinationsNonIntegral() {
|
|
float f = 0f;
|
|
long l = 0L;
|
|
double d = 0d;
|
|
Float fB = 0F;
|
|
Long lB = 0L;
|
|
Double dB = 0D;
|
|
|
|
switch (f) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
|
|
switch (l) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
|
|
switch (d) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
|
|
switch (fB) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
|
|
switch (lB) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
|
|
switch (dB) {
|
|
case 1l: return;
|
|
case 2f: return;
|
|
case 3d: return;
|
|
default:
|
|
}
|
|
}
|
|
|
|
int switchOverPrimitiveBooleanExhaustiveWithNonPermittedUnconditional(boolean b) {
|
|
return switch (b) {
|
|
case true -> 1;
|
|
case false -> 2;
|
|
case boolean bb -> 3; // error
|
|
};
|
|
}
|
|
|
|
int duplicateUnconditionalWithPrimitives(int i) {
|
|
return switch (i) {
|
|
case int ii -> 1;
|
|
case long l -> 2; // error
|
|
};
|
|
}
|
|
|
|
int booleanSingleCase1(boolean b) {
|
|
return switch (b) {
|
|
case true -> 1;
|
|
};
|
|
}
|
|
|
|
int booleanSingleCase2(boolean b) {
|
|
switch (b) {
|
|
case true: return 1;
|
|
}
|
|
}
|
|
|
|
void nullAndPrimitive() {
|
|
int i = 42;
|
|
switch (i) {
|
|
case short s -> System.out.println("its a short");
|
|
case null -> System.out.println("oops");
|
|
default -> System.out.println("any other integral value");
|
|
}
|
|
}
|
|
|
|
public static int nonExhaustive4() {
|
|
Number n = Byte.valueOf((byte) 42);
|
|
return switch (n) { // Error - not exhaustive
|
|
case byte b when b == 42 -> 1;
|
|
case byte b -> -1 ;
|
|
};
|
|
}
|
|
|
|
public static int nonExhaustive5() {
|
|
Object n = 42;
|
|
return switch (n) { // Error - not exhaustive
|
|
case int b when b == 42 -> 1;
|
|
case int b -> -1 ;
|
|
};
|
|
}
|
|
|
|
public static int nonExhaustive6() {
|
|
Object n = 42;
|
|
return switch (n) { // Error - not exhaustive
|
|
case byte b -> -1 ;
|
|
case int b -> -2 ;
|
|
};
|
|
}
|
|
|
|
public static int disallowedUnboxingAndNarrowing1() {
|
|
Long n = 42l;
|
|
return switch (n) { // Error - not exhaustive and not allowed
|
|
case char c -> -1 ;
|
|
};
|
|
}
|
|
|
|
public static int disallowedUnboxingAndNarrowing2() {
|
|
Long n = 42l;
|
|
return switch (n) { // Error - not exhaustive and not allowed
|
|
case int c -> -1 ;
|
|
};
|
|
}
|
|
|
|
public static char disallowedUnboxingAndWidening(Short test) {
|
|
return switch (test) {
|
|
case char c -> c; // Error - not exhaustive and not allowed
|
|
};
|
|
}
|
|
|
|
public static <T extends Integer> boolean wideningReferenceConversionUnboxingAndNarrowingPrimitive(T i) {
|
|
return i instanceof byte b; // not allowed as a conversion
|
|
}
|
|
}
|