From 6cf90cfc4eb5474cdc655caf90da7e4889178148 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 10 Aug 2016 13:05:23 +0300 Subject: [PATCH] Fix for SOE in VarianceChecker #KT-13401 Fixed --- .../testData/diagnostics/tests/kt13401.kt | 15 +++++++++ .../testData/diagnostics/tests/kt13401.txt | 32 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++ .../jetbrains/kotlin/types/VarianceChecker.kt | 2 +- .../addVarianceModifier/recursiveGeneric.kt | 7 ++++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/kt13401.kt create mode 100644 compiler/testData/diagnostics/tests/kt13401.txt create mode 100644 idea/testData/inspections/addVarianceModifier/recursiveGeneric.kt diff --git a/compiler/testData/diagnostics/tests/kt13401.kt b/compiler/testData/diagnostics/tests/kt13401.kt new file mode 100644 index 00000000000..d429c0366ab --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt13401.kt @@ -0,0 +1,15 @@ +// See KT-13401: SOE in VarianceChecker +interface Rec> { + fun t(): T +} +interface Super { + fun foo(p: Rec<*>) = p.t() +} +// Related variance errors +class Owner { + inner class InnerT>(val u: U) { + fun getT() = u + } + + fun foo(arg: Inner<*>) = arg.getT() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/kt13401.txt b/compiler/testData/diagnostics/tests/kt13401.txt new file mode 100644 index 00000000000..879c71b95a9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt13401.txt @@ -0,0 +1,32 @@ +package + +public final class Owner { + public constructor Owner() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ arg: Owner.Inner<*>): kotlin.Any? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final inner class Inner /*captured type parameters: /*1*/ in T*/ { + public constructor Inner(/*0*/ u: U) + public final val u: U + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun getT(): U + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public interface Rec> { + 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 abstract fun t(): T + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Super { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ p: Rec<*>): Rec<*> + 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/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index aa4eb65b985..0a4a31a1069 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -355,6 +355,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("kt13401.kt") + public void testKt13401() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/kt13401.kt"); + doTest(fileName); + } + @TestMetadata("kt310.kt") public void testKt310() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/kt310.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/VarianceChecker.kt b/core/descriptors/src/org/jetbrains/kotlin/types/VarianceChecker.kt index 78da59f82d6..90c09ad11ff 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/VarianceChecker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/VarianceChecker.kt @@ -56,7 +56,7 @@ fun > D.checkTypePosition( var noError = true for (argument in arguments) { - if (argument == null || argument.typeParameter == null) continue + if (argument == null || argument.typeParameter == null || argument.projection.isStarProjection) continue val projectionKind = TypeCheckingProcedure.getEffectiveProjectionKind(argument.typeParameter!!, argument.projection)!! val newPosition = when (projectionKind) { diff --git a/idea/testData/inspections/addVarianceModifier/recursiveGeneric.kt b/idea/testData/inspections/addVarianceModifier/recursiveGeneric.kt new file mode 100644 index 00000000000..d546f3ad410 --- /dev/null +++ b/idea/testData/inspections/addVarianceModifier/recursiveGeneric.kt @@ -0,0 +1,7 @@ +// See KT-13401 +interface Rec> { + fun t(): T +} +interface Super { + fun foo(p: Rec<*>) = p.t() +} \ No newline at end of file