K2: Fix false-positive on delegated constructor call of outer class

See callingOuterGenericClassConstructorWithSelfTypes.kt
Previously, for A<B>(""), we used substituted constructor
where `X` was substituted with `B` (or `A<X>.B`).

But when resolving the call for constructor, we use `X`
as a type variable of the call, thus in some positions
we used `X` as TV (Xv in the comments) and somewhere `X` as a type
parameter, thus leading to contradictions (see clarifying comment).

The idea of the fix is simply repeating of the regular (not delegated)
constructor call resolution:
- We substitute only type parameters of outer class
- All the declared parameters of the callee are being checked
through regular resolution & inference mechanisms.

NB: Diagnostic only being reported on arguments because there
when we add `String <: Any` constraint it fails due to existing
contradiction in the CS.

Without the argument/parameter the error is just being lost, but that's
a different story (seeKT-65224).

^KT-64841 Fixed
This commit is contained in:
Denis.Zharkov
2024-01-23 13:05:00 +01:00
committed by Space Team
parent 81d559ad7f
commit 7b82ca8b6f
10 changed files with 26 additions and 40 deletions
@@ -1,6 +0,0 @@
open class Test<T1, T2>(val map1 : Map<T1, T2>, val map2 : Map<T2, T1>) {
open val inverse: Test<T2, T1> = object : Test<T2, T1>(<!ARGUMENT_TYPE_MISMATCH!>map2<!>, <!ARGUMENT_TYPE_MISMATCH!>map1<!>) {
override val inverse: Test<T1, T2>
get() = this@Test
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class Test<T1, T2>(val map1 : Map<T1, T2>, val map2 : Map<T2, T1>) {
open val inverse: Test<T2, T1> = object : Test<T2, T1>(map2, map1) {
override val inverse: Test<T1, T2>