From 06a592c018839367770d3570480f6b47cd78c77d Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 26 Aug 2020 15:38:25 +0300 Subject: [PATCH] Fix SOE when recursive type argument is used with star projection #KT-41043 Fixed --- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../PostponedArgumentInputTypesResolver.kt | 4 +++- ...straintInsideTypeArgumentWithStarProjection.kt | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 9 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index e6cda724585..ad13827d89e 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -12657,6 +12657,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt index 4474b792e4d..c88b300c7e9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt @@ -403,7 +403,9 @@ class PostponedArgumentInputTypesResolver( listOf(typeConstructor) + relatedVariables.filterIsInstance() } type.arguments.isNotEmpty() -> { - type.arguments.flatMap { getAllDeeplyRelatedTypeVariables(it.type, variableDependencyProvider) } + type.arguments.flatMap { + if (it.isStarProjection) emptyList() else getAllDeeplyRelatedTypeVariables(it.type, variableDependencyProvider) + } } else -> emptyList() } diff --git a/compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt b/compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt new file mode 100644 index 00000000000..53726f50fe6 --- /dev/null +++ b/compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt @@ -0,0 +1,15 @@ +class Foo(val key: T) +class Bar() + +class KFlowable { + fun scan(initial: R, accumulator: (R, T) -> R) {} +} + +fun test(k: KFlowable>>) { + k.scan(Bar()) { s, t -> Bar() } +} + +fun box(): String { + test(KFlowable()) + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 7aaf32654ed..5ff1d4242a4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13882,6 +13882,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b6237083194..fc238d6648c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13882,6 +13882,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index f76b169818c..23cd43d0850 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12657,6 +12657,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index fa372bf5154..548eeda8143 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -10827,6 +10827,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 3f1b348aebb..ebf3b8b4016 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10827,6 +10827,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 695ffba8619..a3ca82a8c47 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -10892,6 +10892,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); } + @TestMetadata("recursiveConstraintInsideTypeArgumentWithStarProjection.kt") + public void testRecursiveConstraintInsideTypeArgumentWithStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/inference/recursiveConstraintInsideTypeArgumentWithStarProjection.kt"); + } + @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt") public void testReferenceToCatchParameterFromLambdaExpression() throws Exception { runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");