K2: Fix false-negative RETURN_TYPE_MISMATCH
^KT-53987 Fixed ^KT-55932 Fixed
This commit is contained in:
committed by
Space Team
parent
d7399ed1cf
commit
9fa0f51a61
@@ -152,7 +152,7 @@ fun illegalIfBlock(): Boolean {
|
||||
else { return <!RETURN_TYPE_MISMATCH!>1<!> }
|
||||
}
|
||||
fun illegalReturnIf(): Char {
|
||||
return if (1 < 2) 'a' else { 1 }
|
||||
return <!RETURN_TYPE_MISMATCH!>if (1 < 2) 'a' else { 1 }<!>
|
||||
}
|
||||
|
||||
fun returnNothing(): Nothing {
|
||||
|
||||
+2
-2
@@ -24,11 +24,11 @@ fun <T> bind2(r: Option<T>): Option<T> {
|
||||
}
|
||||
|
||||
fun <T, R> bind3(r: Option<T>): Option<T> {
|
||||
return if (r is Some) {
|
||||
return <!RETURN_TYPE_MISMATCH!>if (r is Some) {
|
||||
// Diagnoses an error correctly
|
||||
if (true) None<R>() else r
|
||||
}
|
||||
else r
|
||||
else r<!>
|
||||
}
|
||||
|
||||
fun <T> bindWhen(r: Option<T>): Option<T> {
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// SKIP_TXT
|
||||
// ISSUE: KT-55932
|
||||
|
||||
fun test(x: String?): Int = <!RETURN_TYPE_MISMATCH!>x?.length ?: "smth"<!>
|
||||
@@ -0,0 +1,4 @@
|
||||
// SKIP_TXT
|
||||
// ISSUE: KT-55932
|
||||
|
||||
fun test(x: String?): Int = <!TYPE_MISMATCH!>x?.length ?: "smth"<!>
|
||||
+1
-1
@@ -6,6 +6,6 @@ fun foo() {
|
||||
|
||||
val a = object {
|
||||
fun baz() = bar(if (x == null) 0 else x)
|
||||
fun quux(): Int = if (x == null) x else x
|
||||
fun quux(): Int = <!RETURN_TYPE_MISMATCH!>if (x == null) x else x<!>
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -24,4 +24,4 @@ class C<R>() {
|
||||
}
|
||||
|
||||
var c1: Int by C()
|
||||
var c2: Int by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>C<Number>()<!>
|
||||
var c2: Int by <!DELEGATE_SPECIAL_FUNCTION_RETURN_TYPE_MISMATCH!>C<Number>()<!>
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
class StringDelegate(val s: String) {
|
||||
operator fun getValue(a: Any?, p: KProperty<*>): Int = 42
|
||||
}
|
||||
|
||||
// NB no operator
|
||||
fun String.provideDelegate(a: Any?, p: KProperty<*>) = StringDelegate(this)
|
||||
|
||||
operator fun String.getValue(a: Any?, p: KProperty<*>) = this
|
||||
|
||||
val test1: String by "OK"
|
||||
val test2: Int by <!DELEGATE_SPECIAL_FUNCTION_RETURN_TYPE_MISMATCH!>"OK"<!>
|
||||
val test3 by "OK"
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
val c: Int by <!DELEGATE_SPECIAL_FUNCTION_RETURN_TYPE_MISMATCH!>Delegate()<!>
|
||||
|
||||
class Delegate {
|
||||
operator fun getValue(t: Any?, p: KProperty<*>): String {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
+12
-12
@@ -9,46 +9,46 @@ fun f1(s: Int?): Int {
|
||||
}
|
||||
|
||||
fun f2(s: Int?): Int {
|
||||
return when (s) {
|
||||
return <!RETURN_TYPE_MISMATCH!>when (s) {
|
||||
!is Int -> s
|
||||
else -> s
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
fun f3(s: Int?): Int {
|
||||
return when (s) {
|
||||
return <!RETURN_TYPE_MISMATCH!>when (s) {
|
||||
is Int -> s
|
||||
else -> s
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
fun f4(s: Int?): Int {
|
||||
return when {
|
||||
return <!RETURN_TYPE_MISMATCH!>when {
|
||||
s == 4 -> s
|
||||
s == null -> s
|
||||
else -> s
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
fun f5(s: Int?): Int {
|
||||
return when (s) {
|
||||
return <!RETURN_TYPE_MISMATCH!>when (s) {
|
||||
s -> s
|
||||
s!! -> s
|
||||
s -> s
|
||||
else -> 0
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
fun f6(s: Int?): Int {
|
||||
return when {
|
||||
return <!RETURN_TYPE_MISMATCH!>when {
|
||||
s is Int -> s
|
||||
else -> s
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
fun f7(s: Int?): Int {
|
||||
return when {
|
||||
return <!RETURN_TYPE_MISMATCH!>when {
|
||||
s !is Int -> s
|
||||
else -> s
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
|
||||
@@ -99,13 +99,13 @@ fun testTwoLambdas() {
|
||||
{}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
|
||||
return if (true) {
|
||||
return <!RETURN_TYPE_MISMATCH!>if (true) {
|
||||
twoLambdaArgs({})
|
||||
{}
|
||||
<!MANY_LAMBDA_EXPRESSION_ARGUMENTS!>{}<!>
|
||||
} else {
|
||||
<!ARGUMENT_TYPE_MISMATCH!>{}<!>
|
||||
}
|
||||
{}
|
||||
}<!>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ class Example {
|
||||
|
||||
public fun foo(): String {
|
||||
// Smart cast is not possible if property is delegated
|
||||
return if (p != null) p else ""
|
||||
return <!RETURN_TYPE_MISMATCH!>if (p != null) p else ""<!>
|
||||
}
|
||||
|
||||
public fun bar(): String {
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ class Context<T>
|
||||
fun <T> Any.decodeIn(typeFrom: Context<in T>): T = something()
|
||||
|
||||
fun <T> Any?.decodeOut1(typeFrom: Context<out T>): T {
|
||||
return this?.decodeIn(typeFrom) ?: kotlin.Unit
|
||||
return <!RETURN_TYPE_MISMATCH!>this?.decodeIn(typeFrom) ?: kotlin.Unit<!>
|
||||
}
|
||||
|
||||
fun <T> Any.decodeOut2(typeFrom: Context<out T>): T {
|
||||
|
||||
Reference in New Issue
Block a user