KT-8879 Stackoverflow exception on completion from inference
#KT-8879 Fixed Added ConstraintContext storing 'derivedFrom' variables. This information is used to prevent infinite recursion: if a variable was substituted in a type of a bound, it shouldn't be substituted there for the second time.
This commit is contained in:
@@ -6,6 +6,7 @@ interface C : B
|
||||
|
||||
interface Consumer<in T>
|
||||
interface Producer<out T>
|
||||
interface Inv<T>
|
||||
|
||||
interface My<T>
|
||||
interface Successor<T> : My<T>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
VARIABLES T P
|
||||
|
||||
T <: My<T>
|
||||
Inv<P> <: Inv<T>
|
||||
|
||||
type parameter bounds:
|
||||
T <: My<T>*, := P*, <: My<out My<T>>*, <: My<P>*, <: My<out My<P>>*, <: My<out My<out My<T>>>*
|
||||
P := T*, <: My<T>*, <: My<out My<T>>*, <: My<P>*, <: My<out My<P>>*, <: My<out My<out My<T>>>*
|
||||
|
||||
status:
|
||||
-hasCannotCaptureTypesError: false
|
||||
-hasConflictingConstraints: false
|
||||
-hasContradiction: false
|
||||
-hasErrorInConstrainingTypes: false
|
||||
-hasParameterConstraintError: false
|
||||
-hasTypeInferenceIncorporationError: false
|
||||
-hasUnknownParameters: true
|
||||
-hasViolatedUpperBound: false
|
||||
-isSuccessful: false
|
||||
|
||||
result:
|
||||
T=???
|
||||
P=???
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
VARIABLES T P
|
||||
|
||||
T <: My<T>
|
||||
Inv<P> <: Inv<T>
|
||||
@@ -0,0 +1,12 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
interface Inv<I>
|
||||
interface Inv2<I>
|
||||
|
||||
fun <T: Inv2<T>> foo(klass: Inv<T>): String? = null
|
||||
|
||||
fun <X> bar(): Inv<X> = null!!
|
||||
|
||||
fun test() {
|
||||
<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>(<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>())
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ X> bar(): Inv<X>
|
||||
internal fun </*0*/ T : Inv2<T>> foo(/*0*/ klass: Inv<T>): kotlin.String?
|
||||
internal fun test(): kotlin.Unit
|
||||
|
||||
internal interface Inv</*0*/ I> {
|
||||
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
|
||||
}
|
||||
|
||||
internal interface Inv2</*0*/ I> {
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user