From f7a9cc6b28568353ad6fbfdf717b531a9cc106ed Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 19 May 2015 15:25:45 +0300 Subject: [PATCH] Fix for EA-64905 - assert: TypeUtils.intersect --- .../testData/diagnostics/tests/recovery/emptyTypeArgs.kt | 3 +++ .../testData/diagnostics/tests/recovery/emptyTypeArgs.txt | 3 +++ .../kotlin/checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../org/jetbrains/kotlin/types/checker/JetTypeChecker.java | 7 +++++++ .../src/org/jetbrains/kotlin/types/flexibleTypes.kt | 4 +++- 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.kt create mode 100644 compiler/testData/diagnostics/tests/recovery/emptyTypeArgs.txt 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) } } }