diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt index 54037ed2d90..74bb482094e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt @@ -103,6 +103,10 @@ class TypeAliasExpander( argumentVariance } + if (typeAliasArgument.isStarProjection) { + return TypeUtils.makeStarProjection(typeParameterDescriptor!!) + } + val substitutedType = TypeUtils.makeNullableIfNeeded(typeAliasArgument.type, originalType.isMarkedNullable) return TypeProjectionImpl(substitutedVariance, substitutedType) @@ -165,7 +169,7 @@ class TypeAliasExpander( val typeSubstitutor = TypeSubstitutor.create(substitutedType) substitutedType.arguments.forEachIndexed { i, substitutedArgument -> - if (!substitutedArgument.type.containsTypeAliasParameters()) { + if (!substitutedArgument.isStarProjection && !substitutedArgument.type.containsTypeAliasParameters()) { val unsubstitutedArgument = unsubstitutedType.arguments[i] val typeParameter = unsubstitutedType.constructor.parameters[i] DescriptorResolver.checkBoundsInTypeAlias(reportStrategy, unsubstitutedArgument.type, substitutedArgument.type, typeParameter, typeSubstitutor) diff --git a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt index d312988285f..721f69ed1ec 100644 --- a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt +++ b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt @@ -1,7 +1,14 @@ typealias Array2D = Array> -fun foo(a: Array2D) = a +fun foo1(a: Array2D) = a -fun bar(a: Array2D) { - foo(a) -} \ No newline at end of file +fun bar1(a: Array2D) = + foo1( [= Array>]; Array2D [= Array>])!>a) + + +typealias TMap = Map + +fun foo2(m: TMap) = m + +fun bar2(m: TMap<*>) = + foo2(m) diff --git a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt index cce939e20cc..61a00d8cb99 100644 --- a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt +++ b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt @@ -1,5 +1,8 @@ package public typealias Array2D = kotlin.Array> -public fun bar(/*0*/ a: Array2D [= kotlin.Array>]): kotlin.Unit -public fun foo(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public typealias TMap = kotlin.collections.Map +public fun bar1(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public fun bar2(/*0*/ m: TMap<*> [= kotlin.collections.Map<*, *>]): [ERROR : Error function type] +public fun foo1(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public fun foo2(/*0*/ m: TMap [= kotlin.collections.Map]): TMap [= kotlin.collections.Map] diff --git a/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt new file mode 100644 index 00000000000..4f98fe9a121 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt @@ -0,0 +1,6 @@ +class NumCharSeq(val n: N, val m: M) + +typealias Test = NumCharSeq + +fun getN(t: Test<*, *>) = t.n +fun getM(t: Test<*, *>) = t.m diff --git a/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt new file mode 100644 index 00000000000..7683a5da480 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt @@ -0,0 +1,14 @@ +package + +public typealias Test = NumCharSeq +public fun getM(/*0*/ t: Test<*, *> [= NumCharSeq<*, *>]): kotlin.CharSequence +public fun getN(/*0*/ t: Test<*, *> [= NumCharSeq<*, *>]): kotlin.Number + +public final class NumCharSeq { + public constructor NumCharSeq(/*0*/ n: N, /*1*/ m: M) + public final val m: M + public final val n: N + 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/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 9158f70b57b..ac292d24ce9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19605,6 +19605,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("starProjectionInTypeAliasArgument.kt") + public void testStarProjectionInTypeAliasArgument() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt"); + doTest(fileName); + } + @TestMetadata("substitutionVariance.kt") public void testSubstitutionVariance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt");