From b323298b0e4002a54d79e5f57feffc4ea880a54c Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 17 May 2019 15:14:31 +0300 Subject: [PATCH] [NI] Remove deep types in commosn super type for recursive types #KT-30411 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 5 ++ .../calls/NewCommonSuperTypeCalculator.kt | 9 ++- .../tests/enum/commonSupertype.ni.txt | 2 +- .../tests/inference/recursiveTypes.kt | 15 ++++ .../tests/inference/recursiveTypes.txt | 31 ++++++++ .../diagnostics/notLinked/dfa/pos/15.kt | 72 +++++++------------ .../checkers/DiagnosticsTestGenerated.java | 5 ++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++ 8 files changed, 95 insertions(+), 49 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes.kt create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index ab3ea7d8e26..02cbdda7fd3 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -9703,6 +9703,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/inference/possibleCycleOnConstraints.kt"); } + @TestMetadata("recursiveTypes.kt") + public void testRecursiveTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes.kt"); + } + @TestMetadata("reportAboutUnresolvedReferenceAsUnresolved.kt") public void testReportAboutUnresolvedReferenceAsUnresolved() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/reportAboutUnresolvedReferenceAsUnresolved.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt index d64df3bea50..2b2a3e82559 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt @@ -212,7 +212,14 @@ object NewCommonSuperTypeCalculator { if (thereIsStar || typeProjections.isEmpty()) { createStarProjection(parameter) } else { - calculateArgument(parameter, typeProjections, depth) + val argument = calculateArgument(parameter, typeProjections, depth) + val argumentType = argument.getType().asSimpleType() + val argumentConstructor = argumentType?.typeConstructor() + if (argument.getVariance() == TypeVariance.OUT && argumentConstructor == constructor && argumentType.asArgumentList()[index].isStarProjection()) { + createStarProjection(parameter) + } else { + argument + } } arguments.add(argument) diff --git a/compiler/testData/diagnostics/tests/enum/commonSupertype.ni.txt b/compiler/testData/diagnostics/tests/enum/commonSupertype.ni.txt index 9d70472961f..798e50bfc20 100644 --- a/compiler/testData/diagnostics/tests/enum/commonSupertype.ni.txt +++ b/compiler/testData/diagnostics/tests/enum/commonSupertype.ni.txt @@ -1,6 +1,6 @@ package -public val x: kotlin.Enum>>>>> +public val x: kotlin.Enum<*> public final enum class A : kotlin.Enum { enum entry A diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes.kt new file mode 100644 index 00000000000..fb744d676c3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes.kt @@ -0,0 +1,15 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION +// !WITH_NEW_INFERENCE + +interface RecursiveGeneric, U> + +class A : RecursiveGeneric +class B : RecursiveGeneric +class C : RecursiveGeneric + +fun select(x: K, y: K): K = x + +fun foo(a: A, b: B, c: C) { + ")!>select(a, b) + ")!>select(a, c) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes.txt new file mode 100644 index 00000000000..9923d354f6a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes.txt @@ -0,0 +1,31 @@ +package + +public fun foo(/*0*/ a: A, /*1*/ b: B, /*2*/ c: C): kotlin.Unit +public fun select(/*0*/ x: K, /*1*/ y: K): K + +public final class A : RecursiveGeneric { + public constructor A() + 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 final class B : RecursiveGeneric { + public constructor B() + 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 final class C : RecursiveGeneric { + public constructor C() + 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 RecursiveGeneric, /*1*/ U> { + 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 +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/15.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/15.kt index fa271be4fb0..e5494c6369c 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/15.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/15.kt @@ -20,38 +20,19 @@ fun case_1() { val a = select(Case1_1(), Case1_2(), null) if (a != null) { - >>>>> & InterfaceWithTypeParameter1>>>>>?")!>a - val b = >>>>> & InterfaceWithTypeParameter1>>>>>?")!>a.ip1test1() + & InterfaceWithTypeParameter1<*>?")!>a + val b = & InterfaceWithTypeParameter1<*>?")!>a.ip1test1() if (b != null) { - >>>> & InterfaceWithTypeParameter1>>>>?")!>b - val c = >>>> & InterfaceWithTypeParameter1>>>>?")!>b.ip1test1() - if (c != null) { - >>> & InterfaceWithTypeParameter1>>>?")!>c - val d = >>> & InterfaceWithTypeParameter1>>>?")!>c.ip1test1() - if (d != null) { - >> & InterfaceWithTypeParameter1>>?")!>d - val e = >> & InterfaceWithTypeParameter1>>?")!>d.ip1test1() - if (e != null) { - > & InterfaceWithTypeParameter1>?")!>e - val f = > & InterfaceWithTypeParameter1>?")!>e.ip1test1() - if (f != null) { - & InterfaceWithTypeParameter1<*>?")!>f - val g = & InterfaceWithTypeParameter1<*>?")!>f.ip1test1() - if (g != null) { - g.equals(null) - g.propT - g.propAny - g.propNullableT - g.propNullableAny - g.funT() - g.funAny() - g.funNullableT() - g.funNullableAny() - } - } - } - } - } + b + b.equals(null) + b.propT + b.propAny + b.propNullableT + b.propNullableAny + b.funT() + b.funAny() + b.funNullableT() + b.funNullableAny() } } } @@ -177,24 +158,21 @@ fun case_9() { val x = select(Case9_1(), Case9_2(), null) if (x != null) { - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>>?")!>x - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>>?")!>x.test1() + & ClassWithTwoTypeParameters<*, *>?")!>x + & ClassWithTwoTypeParameters<*, *>?")!>x.test1() val y = x.test2() if (y != null) { - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>?")!>y - val z = , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>>?")!>y.test2() - if (z != null) { - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.equals(null) - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.propT - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.propAny - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.propNullableT - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.propNullableAny - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.funT() - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.funAny() - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.funNullableT() - , out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>> & ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>, out ClassWithTwoTypeParameters, out ClassWithTwoTypeParameters<*, *>>>>>?")!>z.funNullableAny() - } + y + y + y.equals(null) + y.propT + y.propAny + y.propNullableT + y.propNullableAny + y.funT() + y.funAny() + y.funNullableT() + y.funNullableAny() } } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 99fc24262ca..610a877aae6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -9710,6 +9710,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/inference/possibleCycleOnConstraints.kt"); } + @TestMetadata("recursiveTypes.kt") + public void testRecursiveTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes.kt"); + } + @TestMetadata("reportAboutUnresolvedReferenceAsUnresolved.kt") public void testReportAboutUnresolvedReferenceAsUnresolved() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/reportAboutUnresolvedReferenceAsUnresolved.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index a08e2a4b987..2026a77a3ba 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -9705,6 +9705,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/possibleCycleOnConstraints.kt"); } + @TestMetadata("recursiveTypes.kt") + public void testRecursiveTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes.kt"); + } + @TestMetadata("reportAboutUnresolvedReferenceAsUnresolved.kt") public void testReportAboutUnresolvedReferenceAsUnresolved() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/reportAboutUnresolvedReferenceAsUnresolved.kt");