diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java index 4de241c95f0..5bd5219e9d9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java @@ -166,14 +166,18 @@ public class JavaTypeTransformer { List parameters = classData.getTypeConstructor().getParameters(); if (isRaw(classType, !parameters.isEmpty())) { for (TypeParameterDescriptor parameter : parameters) { - TypeProjection starProjection = SubstitutionUtils.makeStarProjection(parameter); - if (howThisTypeIsUsed == SUPERTYPE) { - // projections are not allowed in immediate arguments of supertypes - arguments.add(new TypeProjection(starProjection.getType())); - } - else { - arguments.add(starProjection); - } + // not making a star projection because of this case: + // Java: + // class C {} + // The upper bound is raw here, and we can't compute the projection: it would be infinite: + // C<*> = C>> + // this way we loose some type information, even when the case is not so bad, but it doesn't seem to matter + + // projections are not allowed in immediate arguments of supertypes + Variance projectionKind = parameter.getVariance() == OUT_VARIANCE || howThisTypeIsUsed == SUPERTYPE + ? INVARIANT + : OUT_VARIANCE; + arguments.add(new TypeProjection(projectionKind, KotlinBuiltIns.getInstance().getNullableAnyType())); } } else { diff --git a/compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound.kt b/compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound.kt new file mode 100644 index 00000000000..afc8fc1e2eb --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound.kt @@ -0,0 +1,13 @@ +// FILE: Bad.java + +class Bad {} + +// FILE: X.java + +class X { + Bad foo() {return null;} +} + +// FILE: Usage.kt + +fun foo(p: X) = p.foo() diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index abb5951ef74..23b4bdc5a39 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3314,6 +3314,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/j+k/packageVisibility.kt"); } + @TestMetadata("recursiveRawUpperBound.kt") + public void testRecursiveRawUpperBound() throws Exception { + doTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound.kt"); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { doTest("compiler/testData/diagnostics/tests/j+k/Simple.kt");