diff --git a/compiler/testData/diagnostics/tests/generics/starProjections/invalid.kt b/compiler/testData/diagnostics/tests/generics/starProjections/invalid.kt new file mode 100644 index 00000000000..4885be01a82 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/starProjections/invalid.kt @@ -0,0 +1,26 @@ +// !CHECK_TYPE +// !DIAGNOSTICS: -UNUSED_PARAMETER +// FILE: main.kt +class Inv(val x: T) + +class A> { + fun foo(): T = null!! +} + +class Inv2<T : Inv2>(val x: T) + +fun main(a: A<*>, j: JavaClass<*>, i2: Inv2<*>) { + // Probably it's too restrictive to suppose star projection type here as Any?, + // but looks like we can refine it later + a.foo() checkType { _() } + j.foo() checkType { _() } + i2.x checkType { _() } + + j.bar(1, 2, Any()) +} + +// FILE: JavaClass.java +public class JavaClass> { + public void bar(T... x) {} + public T foo() {} +} diff --git a/compiler/testData/diagnostics/tests/generics/starProjections/invalid.txt b/compiler/testData/diagnostics/tests/generics/starProjections/invalid.txt new file mode 100644 index 00000000000..dd7d1ed4253 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/starProjections/invalid.txt @@ -0,0 +1,36 @@ +package + +public fun main(/*0*/ a: A<*>, /*1*/ j: JavaClass<*>, /*2*/ i2: Inv2<*>): kotlin.Unit + +public final class A> { + public constructor A>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): T + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv { + public constructor Inv(/*0*/ x: T) + public final val x: T + 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 Inv2> { + public constructor Inv2>(/*0*/ x: T) + public final val x: T + 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 open class JavaClass!> { + public constructor JavaClass!>() + public open fun bar(/*0*/ vararg x: T! /*kotlin.Array<(out) T!>!*/): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(): T! + 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 b23cb6499c8..831ad7be3bf 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -8104,6 +8104,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/generics/starProjections/inheritedFromKotlin.kt"); doTest(fileName); } + + @TestMetadata("invalid.kt") + public void testInvalid() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/generics/starProjections/invalid.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/tests/generics/tpAsReified") diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/StarProjectionImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/types/StarProjectionImpl.kt index f4632371222..1693478b8b6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/StarProjectionImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/StarProjectionImpl.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.types import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns class StarProjectionImpl( private val typeParameter: TypeParameterDescriptor @@ -45,7 +46,7 @@ fun TypeParameterDescriptor.starProjectionType(): KotlinType { else null } - ).substitute(this.upperBounds.first(), Variance.OUT_VARIANCE)!! + ).substitute(this.upperBounds.first(), Variance.OUT_VARIANCE) ?: builtIns.defaultBound } class TypeBasedStarProjectionImpl( @@ -56,4 +57,4 @@ class TypeBasedStarProjectionImpl( override fun getProjectionKind() = Variance.OUT_VARIANCE override fun getType() = _type -} \ No newline at end of file +}