[FE 1.0] Check for type mismatch for empty when statements

^KT-47922 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-08-04 13:16:04 +03:00
committed by TeamCityServer
parent 60195114c1
commit 8578f0beea
24 changed files with 487 additions and 22 deletions
@@ -0,0 +1,25 @@
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-100
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
* NUMBER: 1
* DESCRIPTION: Non-exhaustive when, without bound value, without else branch.
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> {
value_1 == 1 -> ""
value_1 == 2 -> ""
value_1 == 3 -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> {
value_1 == 1 -> ""
}
// TESTCASE NUMBER: 3
fun case_3(): Int = <!NO_ELSE_IN_WHEN!>when<!> {}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// SKIP_TXT
/*
@@ -23,4 +22,4 @@ fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> {
}
// TESTCASE NUMBER: 3
fun case_3(): Int = <!NO_ELSE_IN_WHEN!>when<!> {}
fun case_3(): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!> {}<!>
@@ -0,0 +1,26 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-100
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
* NUMBER: 2
* DESCRIPTION: Non-exhaustive when, with bound value, without else branch.
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
1 -> ""
2 -> ""
3 -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
1 -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Int): Int = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -24,4 +23,4 @@ fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Int): Int = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {}
fun case_3(value_1: Int): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!> (value_1) {}<!>
@@ -0,0 +1,35 @@
// LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-435
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 11
* NUMBER: 1
* DESCRIPTION: Non-exhaustive when using nullable boolean values.
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
true -> ""
false -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
true -> ""
null -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Boolean?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
// TESTCASE NUMBER: 4
fun case_4(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
true && false && ((true || false)) || true && !!!false && !!!true -> ""
true && false && ((true || false)) || true && !!!false -> ""
null -> ""
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -26,7 +25,7 @@ fun case_2(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Boolean?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
fun case_3(value_1: Boolean?): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) { }<!>
// TESTCASE NUMBER: 4
fun case_4(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
@@ -0,0 +1,81 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-435
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 11
* NUMBER: 2
* DESCRIPTION: Non-exhaustive when using subclasses of the nullable sealed class.
* HELPERS: sealedClasses
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: SealedClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedChild1 -> ""
is SealedChild2 -> ""
is SealedChild3 -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
SealedMixedChildObject1 -> ""
null -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
null, is SealedMixedChild1, is SealedMixedChild2, SealedMixedChildObject1 -> ""
}
// TESTCASE NUMBER: 4
fun case_4(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
is SealedMixedChild3 -> ""
SealedMixedChildObject1 -> ""
SealedMixedChildObject2 -> ""
SealedMixedChildObject3 -> ""
}
// TESTCASE NUMBER: 5
fun case_5(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
is SealedMixedChild3 -> ""
}
// TESTCASE NUMBER: 6
fun case_6(value_1: SealedClassMixed?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
// TESTCASE NUMBER: 7
fun case_7(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2-> ""
is SealedMixedChild3 -> ""
null -> ""
}
// TESTCASE NUMBER: 8
fun case_8(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
SealedMixedChildObject1 -> ""
}
/*
* TESTCASE NUMBER: 9
* DISCUSSION: maybe make exhaustive without else?
*/
fun case_9(value_1: Any?): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
is Any -> ""
null -> ""
}
/*
* TESTCASE NUMBER: 10
* DISCUSSION
* ISSUES: KT-26044
*/
fun case_10(value: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -50,7 +49,7 @@ fun case_5(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(valu
}
// TESTCASE NUMBER: 6
fun case_6(value_1: SealedClassMixed?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
fun case_6(value_1: SealedClassMixed?): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) {}<!>
// TESTCASE NUMBER: 7
fun case_7(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
@@ -79,4 +78,4 @@ fun case_9(value_1: Any?): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
* DISCUSSION
* ISSUES: KT-26044
*/
fun case_10(value: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {}
fun case_10(value: SealedClassEmpty): String = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!> (value) {}<!>
@@ -0,0 +1,46 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-435
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 11
* NUMBER: 3
* DESCRIPTION: Non-exhaustive when using nullable enum values.
* HELPERS: enumClasses
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
EnumClass.EAST -> ""
EnumClass.SOUTH -> ""
EnumClass.NORTH -> ""
EnumClass.WEST -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
EnumClass.EAST -> ""
EnumClass.SOUTH -> ""
EnumClass.NORTH -> ""
null -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
EnumClass.EAST, null, EnumClass.SOUTH, EnumClass.NORTH -> ""
}
// TESTCASE NUMBER: 4
fun case_4(value_1: EnumClassSingle): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
// TESTCASE NUMBER: 5
fun case_5(value_1: EnumClassSingle?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
EnumClassSingle.EVERYTHING -> ""
}
// TESTCASE NUMBER: 6
fun case_6(value_1: EnumClassSingle?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
null -> ""
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -34,7 +33,7 @@ fun case_3(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
}
// TESTCASE NUMBER: 4
fun case_4(value_1: EnumClassSingle): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
fun case_4(value_1: EnumClassSingle): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) {}<!>
// TESTCASE NUMBER: 5
fun case_5(value_1: EnumClassSingle?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
@@ -0,0 +1,53 @@
// LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-100
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 3
* NUMBER: 1
* DESCRIPTION: Non-exhaustive when using boolean values.
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
true -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
false -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Boolean): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
// TESTCASE NUMBER: 4
fun case_4(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!> {
value_1 == true -> ""
value_1 == false -> ""
}
/*
* TESTCASE NUMBER: 5
* DISCUSSION: maybe use const propagation here?
* ISSUES: KT-25265
*/
fun case_5(value_1: Boolean): String {
val trueValue = true
val falseValue = false
return <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
trueValue -> ""
falseValue -> ""
}
}
// TESTCASE NUMBER: 6
fun case_6(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
true && false && ((true || false)) || true && !!!false && !!!true -> ""
true && false && ((true || false)) || true && !!!false -> ""
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -23,7 +22,7 @@ fun case_2(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Boolean): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
fun case_3(value_1: Boolean): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) { }<!>
// TESTCASE NUMBER: 4
fun case_4(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!> {
@@ -0,0 +1,83 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
*
* SPEC VERSION: 0.1-435
* MAIN LINK: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 9
* NUMBER: 1
* DESCRIPTION: Non-exhaustive when using subclasses of the sealed class.
* HELPERS: sealedClasses
*/
// TESTCASE NUMBER: 1
fun case_1(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedChild1 -> ""
is SealedChild2 -> ""
}
// TESTCASE NUMBER: 2
fun case_2(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedChild1, is SealedChild2 -> ""
}
// TESTCASE NUMBER: 3
fun case_3(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
SealedMixedChildObject1 -> ""
}
// TESTCASE NUMBER: 4
fun case_4(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
SealedMixedChildObject1, is SealedMixedChild2, is SealedMixedChild1 -> ""
}
// TESTCASE NUMBER: 5
fun case_5(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
is SealedMixedChild3 -> ""
}
// TESTCASE NUMBER: 6
fun case_6(value_1: SealedClassMixed): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
// TESTCASE NUMBER: 7
fun case_7(value_1: SealedClassSingleWithObject): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
// TESTCASE NUMBER: 8
fun case_8(value_1: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) { }
// TESTCASE NUMBER: 9
fun case_9(value_1: Number): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
is Byte -> ""
is Double -> ""
is Float -> ""
is Int -> ""
is Long -> ""
is Short -> ""
}
/*
* TESTCASE NUMBER: 10
* DISCUSSION: maybe make exhaustive without else?
*/
fun case_10(value_1: Any): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
<!USELESS_IS_CHECK!>is Any<!> -> ""
}
// TESTCASE NUMBER: 11
fun case_11(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!> {
value_1 is SealedChild1 -> ""
value_1 is SealedChild2 -> ""
value_1 is SealedChild3 -> ""
}
// TESTCASE NUMBER: 12
fun case_12(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
is SealedMixedChild1 -> ""
is SealedMixedChild2 -> ""
is SealedMixedChild3 -> ""
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// SKIP_TXT
@@ -43,13 +42,13 @@ fun case_5(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value
}
// TESTCASE NUMBER: 6
fun case_6(value_1: SealedClassMixed): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
fun case_6(value_1: SealedClassMixed): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) { }<!>
// TESTCASE NUMBER: 7
fun case_7(value_1: SealedClassSingleWithObject): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
fun case_7(value_1: SealedClassSingleWithObject): Int = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(value_1) { }<!>
// TESTCASE NUMBER: 8
fun case_8(value_1: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) { }
fun case_8(value_1: SealedClassEmpty): String = <!TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!> (value_1) { }<!>
// TESTCASE NUMBER: 9
fun case_9(value_1: Number): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {