[FIR] Add tests for KT-37091 , KT-37081

This commit is contained in:
anastasiia.spaseeva
2020-02-27 14:28:46 +03:00
committed by Mikhail Glukhikh
parent 9a352ad7b0
commit 1ce96b7433
6 changed files with 450 additions and 0 deletions
+56
View File
@@ -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
View File
@@ -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|)
}
@@ -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");
@@ -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");