From f730c1357c473e46c18eaa81b59fac44db0e3391 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Mon, 6 Aug 2012 18:08:26 +0400 Subject: [PATCH] KT-2484 Type inferred for function literal is (...) -> Int instead of (...) -> Unit, when function literal parameter is explicit #KT-2484 fixed --- .../ClosureExpressionsTypingVisitor.java | 3 +-- .../tests/inference/regressions/kt2484.kt | 23 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/regressions/kt2484.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java index 2104323bb1c..42219f8a286 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java @@ -135,8 +135,7 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { JetType safeReturnType = returnType == null ? ErrorUtils.createErrorType("") : returnType; functionDescriptor.setReturnType(safeReturnType); - boolean hasDeclaredValueParameters = functionLiteral.getValueParameterList() != null; - if (!hasDeclaredValueParameters && functionTypeExpected) { + if (!functionLiteral.hasDeclaredReturnType() && functionTypeExpected) { JetType expectedReturnType = JetStandardClasses.getReturnTypeFromFunctionType(expectedType); if (JetStandardClasses.isUnit(expectedReturnType)) { functionDescriptor.setReturnType(JetStandardClasses.getUnitType()); diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2484.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt2484.kt new file mode 100644 index 00000000000..d5beed6abfb --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2484.kt @@ -0,0 +1,23 @@ +//KT-2484 Type inferred for function literal is (...) -> Int instead of (...) -> Unit, when function literal parameter is explicit + +package a +//+JDK +import java.util.List + +fun Array.forEach(operation: (T) -> Unit) : Unit = for (element in this) operation(element) + +fun bar(operation: (String) -> Unit) = operation("") + +fun main(args: Array) { + args.forEach { (a : String) : Unit -> a.length } // Type mismatch: (String) -> Unit required, (String) -> Int found + args.forEach { (a) : Unit -> a.length } // Type mismatch: (String) -> Unit required, (String) -> Int found + args.forEach { (a : String) -> a.length } // Type mismatch: (String) -> Unit required, (String) -> Int found + args.forEach { a -> a.length } // Type mismatch: (String) -> Unit required, (String) -> Int found + args.forEach { it.length } // This works! + + bar { (a: String) : Unit -> a.length } + bar { (a) : Unit -> a.length } + bar { (a: String) -> a.length } + bar { a -> a.length } + bar { it.length } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index bb5f7bc213d..5725ef88af0 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1380,6 +1380,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2324.kt"); } + @TestMetadata("kt2484.kt") + public void testKt2484() throws Exception { + doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2484.kt"); + } + @TestMetadata("kt2514.kt") public void testKt2514() throws Exception { doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2514.kt");