[FIR] Add tests for KT-37091 , KT-37081
This commit is contained in:
committed by
Mikhail Glukhikh
parent
9a352ad7b0
commit
1ce96b7433
@@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* UNEXPECTED BEHAVIOUR
|
||||||
|
* ISSUES: KT-37081
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
A1,
|
||||||
|
A2,
|
||||||
|
}
|
||||||
|
class B()
|
||||||
|
class C(val b : B)
|
||||||
|
fun get(f: Boolean) = if (f) {A.A1} else {""}
|
||||||
|
|
||||||
|
fun case2() {
|
||||||
|
|
||||||
|
val flag: Any = get(false) //string
|
||||||
|
val l1 = when (flag!!) { // should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
|
||||||
|
val l2 = when (flag) {// should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case2() {
|
||||||
|
|
||||||
|
val flag: Any = get(true) //A
|
||||||
|
val l1 = when (flag!!) {// should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
|
||||||
|
val l2 = when (flag) {// should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case3() {
|
||||||
|
|
||||||
|
val flag = "" //A
|
||||||
|
val l1 = when (flag!!) {// should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B() //should be INCOMPATIBLE_TYPES
|
||||||
|
A.A2 -> B() //should be INCOMPATIBLE_TYPES
|
||||||
|
}
|
||||||
|
|
||||||
|
val l2 = when (flag) {// should be NO_ELSE_IN_WHEN
|
||||||
|
A.A1 -> B() //should be INCOMPATIBLE_TYPES
|
||||||
|
A.A2 -> B() //should be INCOMPATIBLE_TYPES
|
||||||
|
}
|
||||||
|
}
|
||||||
+104
@@ -0,0 +1,104 @@
|
|||||||
|
FILE: whenElse.kt
|
||||||
|
public final enum class A : R|kotlin/Enum<A>| {
|
||||||
|
private constructor(): R|A| {
|
||||||
|
super<R|kotlin/Enum<A>|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static enum entry A1: R|A|
|
||||||
|
public final static enum entry A2: R|A|
|
||||||
|
public final static fun values(): R|kotlin/Array<A>| {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static fun valueOf(value: R|kotlin/String|): R|A| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class B : R|kotlin/Any| {
|
||||||
|
public constructor(): R|B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class C : R|kotlin/Any| {
|
||||||
|
public constructor(b: R|B|): R|C| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val b: R|B| = R|<local>/b|
|
||||||
|
public get(): R|B|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun get(f: R|kotlin/Boolean|): R|kotlin/Comparable<it(A & kotlin/String)>| {
|
||||||
|
^get when () {
|
||||||
|
R|<local>/f| -> {
|
||||||
|
Q|A|.R|/A.A1|
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun case2(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = R|/get|(Boolean(false))
|
||||||
|
lval l1: R|kotlin/Unit| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval l2: R|kotlin/Unit| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun case2(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = R|/get|(Boolean(true))
|
||||||
|
lval l1: R|kotlin/Unit| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval l2: R|kotlin/Unit| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun case3(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/String| = String()
|
||||||
|
lval l1: R|kotlin/Unit| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval l2: R|kotlin/Unit| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* UNEXPECTED BEHAVIOUR
|
||||||
|
* ISSUES: KT-37091
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum class A() {
|
||||||
|
A1, A2;
|
||||||
|
}
|
||||||
|
|
||||||
|
class B()
|
||||||
|
class C(val b: B)
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 1
|
||||||
|
fun case1() {
|
||||||
|
val flag = A.A1
|
||||||
|
val l0: B = when (flag!!) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l0) //ok (l0 is B)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 2
|
||||||
|
fun case2() {
|
||||||
|
val flag = A.A1
|
||||||
|
val l0: B = when (flag) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l0) //ok (l0 is B)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 3
|
||||||
|
fun case3() {
|
||||||
|
val flag = A.A1
|
||||||
|
|
||||||
|
val l1 = when (flag!!) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
val x1 = <!INAPPLICABLE_CANDIDATE!>C<!>(l1) //INAPPLICABLE_CANDIDATE (l1 is Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 4
|
||||||
|
fun case4() {
|
||||||
|
val flag = A.A1
|
||||||
|
|
||||||
|
val l2 = when (flag) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
val x2 = C(l2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 5
|
||||||
|
fun case5() {
|
||||||
|
val flag: Any = A.A1
|
||||||
|
val l1 = when (flag) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
else -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 6
|
||||||
|
fun case6() {
|
||||||
|
val flag: Any = A.A1
|
||||||
|
val l1 = when (flag!!) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
else -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 7
|
||||||
|
fun case7() {
|
||||||
|
val flag: Any = A.A1
|
||||||
|
val l1: B = when (flag) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
else -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 8
|
||||||
|
fun case8() {
|
||||||
|
val flag: Any = A.A1
|
||||||
|
val l1: B = when (flag!!) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
else -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 9
|
||||||
|
fun case9() {
|
||||||
|
val flag: Any = A.A1
|
||||||
|
val l1 = when (flag) {
|
||||||
|
A.A1 -> B()
|
||||||
|
A.A2 -> B()
|
||||||
|
}
|
||||||
|
val x1 = C(l1)
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
FILE: whenExpressionType.kt
|
||||||
|
public final enum class A : R|kotlin/Enum<A>| {
|
||||||
|
private constructor(): R|A| {
|
||||||
|
super<R|kotlin/Enum<A>|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static enum entry A1: R|A|
|
||||||
|
public final static enum entry A2: R|A|
|
||||||
|
public final static fun values(): R|kotlin/Array<A>| {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static fun valueOf(value: R|kotlin/String|): R|A| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class B : R|kotlin/Any| {
|
||||||
|
public constructor(): R|B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class C : R|kotlin/Any| {
|
||||||
|
public constructor(b: R|B|): R|C| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val b: R|B| = R|<local>/b|
|
||||||
|
public get(): R|B|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun case1(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|A| = Q|A|.R|/A.A1|
|
||||||
|
lval l0: R|B| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l0|)
|
||||||
|
}
|
||||||
|
public final fun case2(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|A| = Q|A|.R|/A.A1|
|
||||||
|
lval l0: R|B| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l0|)
|
||||||
|
}
|
||||||
|
public final fun case3(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|A| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|kotlin/Unit| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: <ERROR TYPE REF: Inapplicable(INAPPLICABLE): [/C.C]> = <Inapplicable(INAPPLICABLE): [/C.C]>#(R|<local>/l1|)
|
||||||
|
}
|
||||||
|
public final fun case4(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|A| = Q|A|.R|/A.A1|
|
||||||
|
lval l2: R|B| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x2: R|C| = R|/C.C|(R|<local>/l2|)
|
||||||
|
}
|
||||||
|
public final fun case5(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|B| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l1|)
|
||||||
|
}
|
||||||
|
public final fun case6(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|B| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l1|)
|
||||||
|
}
|
||||||
|
public final fun case7(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|B| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l1|)
|
||||||
|
}
|
||||||
|
public final fun case8(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|B| = when (R|<local>/flag|!!) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l1|)
|
||||||
|
}
|
||||||
|
public final fun case9(): R|kotlin/Unit| {
|
||||||
|
lval flag: R|kotlin/Any| = Q|A|.R|/A.A1|
|
||||||
|
lval l1: R|B| = when (R|<local>/flag|) {
|
||||||
|
==($subj$, Q|A|.R|/A.A1|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
==($subj$, Q|A|.R|/A.A2|) -> {
|
||||||
|
R|/B.B|()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lval x1: R|C| = R|/C.C|(R|<local>/l1|)
|
||||||
|
}
|
||||||
+10
@@ -368,6 +368,16 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
|||||||
runTest("compiler/fir/resolve/testData/resolve/whenAsReceiver.kt");
|
runTest("compiler/fir/resolve/testData/resolve/whenAsReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("whenElse.kt")
|
||||||
|
public void testWhenElse() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/whenElse.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("whenExpressionType.kt")
|
||||||
|
public void testWhenExpressionType() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/whenExpressionType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("whenInference.kt")
|
@TestMetadata("whenInference.kt")
|
||||||
public void testWhenInference() throws Exception {
|
public void testWhenInference() throws Exception {
|
||||||
runTest("compiler/fir/resolve/testData/resolve/whenInference.kt");
|
runTest("compiler/fir/resolve/testData/resolve/whenInference.kt");
|
||||||
|
|||||||
Generated
+10
@@ -368,6 +368,16 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
runTest("compiler/fir/resolve/testData/resolve/whenAsReceiver.kt");
|
runTest("compiler/fir/resolve/testData/resolve/whenAsReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("whenElse.kt")
|
||||||
|
public void testWhenElse() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/whenElse.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("whenExpressionType.kt")
|
||||||
|
public void testWhenExpressionType() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/whenExpressionType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("whenInference.kt")
|
@TestMetadata("whenInference.kt")
|
||||||
public void testWhenInference() throws Exception {
|
public void testWhenInference() throws Exception {
|
||||||
runTest("compiler/fir/resolve/testData/resolve/whenInference.kt");
|
runTest("compiler/fir/resolve/testData/resolve/whenInference.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user