diff --git a/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.kt b/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.kt new file mode 100644 index 00000000000..5c6ca5fc41d --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.kt @@ -0,0 +1,13 @@ +// FILE: JavaClass.java +public class JavaClass { + public void foo(? x) {} + + public void bar(? extends String y) { } +} + +// FILE: main.kt +fun foo() { + JavaClass().foo(Any()) + JavaClass().bar(Any()) + JavaClass().bar("") +} diff --git a/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.txt b/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.txt new file mode 100644 index 00000000000..f8704ba23dd --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.txt @@ -0,0 +1,12 @@ +package + +public fun foo(): kotlin.Unit + +public open class JavaClass { + public constructor JavaClass() + public open fun bar(/*0*/ y: kotlin.String!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.Any?): kotlin.Unit + 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 09391e7d63d..710d94bda67 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -6873,6 +6873,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("wildcardInValueParameter.kt") + public void testWildcardInValueParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/generics/wildcardInValueParameter.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/diagnostics/tests/generics/capturedParameters") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index c7686959cc2..fca5f127cfb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -61,6 +61,8 @@ class LazyJavaTypeResolver( ) else LazyJavaClassifierType(javaType, attr) is JavaArrayType -> transformArrayType(javaType, attr) + // Top level type can be a wildcard only in case of broken Java code, but we should not fail with exceptions in such cases + is JavaWildcardType -> javaType.bound?.let { transformJavaType(it, attr) } ?: c.module.builtIns.defaultBound else -> throw UnsupportedOperationException("Unsupported type: " + javaType) } }