[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");
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testWhenInference() throws Exception {
|
||||
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");
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testWhenInference() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/whenInference.kt");
|
||||
|
||||
Reference in New Issue
Block a user