diff --git a/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.kt b/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.kt new file mode 100644 index 00000000000..4152b60aa97 --- /dev/null +++ b/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.kt @@ -0,0 +1,3 @@ +fun main(args: Array) { + args is Array<> +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.txt b/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.txt new file mode 100644 index 00000000000..dc8f04a7788 --- /dev/null +++ b/compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.txt @@ -0,0 +1,3 @@ +package + +internal fun main(/*0*/ args: kotlin.Array): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index cd3f56a3ec9..3b48d84d2df 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -9372,6 +9372,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/recovery"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("emptyTypeArgs.kt") + public void testEmptyTypeArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.kt"); + doTest(fileName); + } + @TestMetadata("namelessInJava.kt") public void testNamelessInJava() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/recovery/namelessInJava.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/JetTypeChecker.java b/core/descriptors/src/org/jetbrains/kotlin/types/checker/JetTypeChecker.java index 8df2183d5e8..72901df2548 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/JetTypeChecker.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/JetTypeChecker.java @@ -28,6 +28,13 @@ public class JetTypeChecker { public static final JetTypeChecker DEFAULT = new JetTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl())); + public static final JetTypeChecker ERROR_TYPES_ARE_EQUAL_TO_ANYTHING = new JetTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl() { + @Override + public boolean assertEqualTypes(@NotNull JetType a, @NotNull JetType b, @NotNull TypeCheckingProcedure typeCheckingProcedure) { + return a.isError() || b.isError() || super.assertEqualTypes(a, b, typeCheckingProcedure); + } + })); + public static final JetTypeChecker FLEXIBLE_UNEQUAL_TO_INFLEXIBLE = new JetTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl()) { @Override protected boolean heterogeneousEquivalence(JetType inflexibleType, JetType flexibleType) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt index 47f32644c2c..dd44594873e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt @@ -79,7 +79,9 @@ fun Collection.singleBestRepresentative(): JetType? { candidate -> this.all { other -> - candidate == other || JetTypeChecker.DEFAULT.equalTypes(candidate, other) + // We consider error types equal to anything here, so that intersections like + // {Array, Array<[ERROR]>} work correctly + candidate == other || JetTypeChecker.ERROR_TYPES_ARE_EQUAL_TO_ANYTHING.equalTypes(candidate, other) } } }