From eb1d7110ececc0408a28db7d568b234b4e461621 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Mon, 16 May 2022 22:33:19 +0800 Subject: [PATCH] FE: Fix null assertion error when left is CollectionLiteral #KT-49961 fixed --- ...DiagnosisCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...dFrontendDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../kotlin/resolve/calls/ArgumentTypeResolver.java | 4 ++++ .../expressions/BasicExpressionTypingVisitor.java | 3 ++- .../diagnostics/tests/inference/kt49961.fir.kt | 10 ++++++++++ .../testData/diagnostics/tests/inference/kt49961.kt | 10 ++++++++++ .../testData/diagnostics/tests/inference/kt49961.txt | 9 +++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ 9 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/inference/kt49961.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/kt49961.kt create mode 100644 compiler/testData/diagnostics/tests/inference/kt49961.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 4df7f90f70d..d5eb4edefd2 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -13870,6 +13870,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inference/kt49658Strict.kt"); } + @Test + @TestMetadata("kt49961.kt") + public void testKt49961() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt49961.kt"); + } + @Test @TestMetadata("kt51844.kt") public void testKt51844() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index eaa22aef3d3..4ff945cb0fe 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -13870,6 +13870,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/kt49658Strict.kt"); } + @Test + @TestMetadata("kt49961.kt") + public void testKt49961() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt49961.kt"); + } + @Test @TestMetadata("kt51844.kt") public void testKt51844() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 70805a36d75..f11eb06d82d 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -13870,6 +13870,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/kt49658Strict.kt"); } + @Test + @TestMetadata("kt49961.kt") + public void testKt49961() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt49961.kt"); + } + @Test @TestMetadata("kt51844.kt") public void testKt51844() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java index 658e221f61e..f08c665274e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java @@ -224,6 +224,10 @@ public class ArgumentTypeResolver { return null; } + public static boolean isCollectionLiteralArgument(@NotNull KtExpression expression) { + return expression instanceof KtCollectionLiteralExpression; + } + @NotNull public KotlinTypeInfo getArgumentTypeInfo( @Nullable KtExpression expression, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index d61d806dc13..9b8e9c6b328 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -1303,7 +1303,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { KotlinTypeInfo leftTypeInfo = BindingContextUtils.getRecordedTypeInfo(left, context.trace.getBindingContext()); boolean isLeftFunctionLiteral = ArgumentTypeResolver.isFunctionLiteralArgument(left, context); boolean isLeftCallableReference = ArgumentTypeResolver.isCallableReferenceArgument(left, context); - if (leftTypeInfo == null && (isLeftFunctionLiteral || isLeftCallableReference)) { + boolean isLeftCollectionLiteral = ArgumentTypeResolver.isCollectionLiteralArgument(left); + if (leftTypeInfo == null && (isLeftFunctionLiteral || isLeftCallableReference || isLeftCollectionLiteral)) { return TypeInfoFactoryKt.noTypeInfo(context); } assert leftTypeInfo != null : "Left expression was not processed: " + expression; diff --git a/compiler/testData/diagnostics/tests/inference/kt49961.fir.kt b/compiler/testData/diagnostics/tests/inference/kt49961.fir.kt new file mode 100644 index 00000000000..e27a7e0bb8c --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/kt49961.fir.kt @@ -0,0 +1,10 @@ +class Xyz { + fun x(): String? { + return try { + [a] ?: XYZ + } + catch (e: Exception) { + null + } + } +} diff --git a/compiler/testData/diagnostics/tests/inference/kt49961.kt b/compiler/testData/diagnostics/tests/inference/kt49961.kt new file mode 100644 index 00000000000..1089af2b7c7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/kt49961.kt @@ -0,0 +1,10 @@ +class Xyz { + fun x(): String? { + return try { + [a] ?: XYZ + } + catch (e: Exception) { + null + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/kt49961.txt b/compiler/testData/diagnostics/tests/inference/kt49961.txt new file mode 100644 index 00000000000..e43612b311f --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/kt49961.txt @@ -0,0 +1,9 @@ +package + +public final class Xyz { + public constructor Xyz() + 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 fun x(): kotlin.String? +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index c0b2f19c565..2979a530b8a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -13876,6 +13876,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/kt49658Strict.kt"); } + @Test + @TestMetadata("kt49961.kt") + public void testKt49961() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt49961.kt"); + } + @Test @TestMetadata("kt51844.kt") public void testKt51844() throws Exception {