Original type is taken into account when intersecting possible types in resolve #KT-10232 Fixed
This commit is contained in:
committed by
Stanislav Erokhin
parent
db2521ee67
commit
fe04cc513b
+1
-1
@@ -197,7 +197,7 @@ class GenericCandidateResolver(private val argumentTypeResolver: ArgumentTypeRes
|
|||||||
val possibleTypes = context.dataFlowInfo.getPossibleTypes(dataFlowValue)
|
val possibleTypes = context.dataFlowInfo.getPossibleTypes(dataFlowValue)
|
||||||
if (possibleTypes.isEmpty()) return type
|
if (possibleTypes.isEmpty()) return type
|
||||||
|
|
||||||
return TypeIntersector.intersectTypes(KotlinTypeChecker.DEFAULT, possibleTypes)
|
return TypeIntersector.intersectTypes(KotlinTypeChecker.DEFAULT, possibleTypes + type)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <D : CallableDescriptor> completeTypeInferenceDependentOnFunctionArgumentsForCall(context: CallCandidateResolutionContext<D>) {
|
fun <D : CallableDescriptor> completeTypeInferenceDependentOnFunctionArgumentsForCall(context: CallCandidateResolutionContext<D>) {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ fun <T : CharSequence?> foo(x: T) {
|
|||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.length
|
<!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||||
x<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
x<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||||
|
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.bar1()
|
x.bar1()
|
||||||
x.bar2()
|
x.bar2()
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.bar3()
|
<!DEBUG_INFO_SMARTCAST!>x<!>.bar3()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// Type inference failed after smart cast
|
||||||
|
|
||||||
|
interface A<T>
|
||||||
|
interface B<T> : A<T>
|
||||||
|
|
||||||
|
fun <T> foo(b: A<T>) = b
|
||||||
|
|
||||||
|
fun <T> test(a: A<T>) {
|
||||||
|
if (a is Any) {
|
||||||
|
// Error:(9, 9) Kotlin: Type inference failed: fun <T> foo(b: A<T>): kotlin.Unit
|
||||||
|
// cannot be applied to (A<T>)
|
||||||
|
foo(a)
|
||||||
|
}
|
||||||
|
foo(a) // ok
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun </*0*/ T> foo(/*0*/ b: A<T>): A<T>
|
||||||
|
public fun </*0*/ T> test(/*0*/ a: A<T>): kotlin.Unit
|
||||||
|
|
||||||
|
public interface A</*0*/ T> {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface B</*0*/ T> : A<T> {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -14742,6 +14742,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt10232.kt")
|
||||||
|
public void testKt10232() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/kt10232.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt1461.kt")
|
@TestMetadata("kt1461.kt")
|
||||||
public void testKt1461() throws Exception {
|
public void testKt1461() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/kt1461.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/kt1461.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user