diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/inlineLambdasAreInplace.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/inlineLambdasAreInplace.fir.txt index 61e25883f6e..e879f6f34e7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/inlineLambdasAreInplace.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/inlineLambdasAreInplace.fir.txt @@ -25,7 +25,7 @@ FILE: inlineLambdasAreInplace.kt } public final fun testGeneric(): R|kotlin/Unit| { lvar x: R|kotlin/String?| = String() - lval lambda: R|() -> kotlin/Unit| = R|/any| kotlin/Unit|>( = any@fun (): R|kotlin/Unit| { + lval lambda: R|() -> kotlin/Unit| = R|/any| kotlin/Unit|>( = any@fun (): R|kotlin/Unit| { R|/x| = Null(null) } ) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.dot index 2f40f2054f0..4deedf29d46 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.dot @@ -121,7 +121,7 @@ digraph plusAssignWithLambdaInRhs_kt { 46 [label="Postponed exit from lambda"]; 47 [label="Function call: R|/A.A|(...)" style="filled" fillcolor=yellow]; 48 [label="Jump: ^postpone R|/A.A|( = A@fun (resolve: R|(T) -> kotlin/Unit|): R|kotlin/Unit| { - R|/queue|.R|kotlin/collections/plusAssign| kotlin/Unit|>(fun (): R|kotlin/Unit| { + R|/queue|.R|kotlin/collections/plusAssign| kotlin/Unit|>(fun (): R|kotlin/Unit| { R|/resolve|.R|SubstitutionOverride|(R|/computation|.R|SubstitutionOverride|()) } ) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.fir.txt index 6b5a6a201ff..85521b52e14 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/plusAssignWithLambdaInRhs.fir.txt @@ -1,7 +1,7 @@ FILE: plusAssignWithLambdaInRhs.kt public final fun test(): R|kotlin/Unit| { lval list: R|kotlin/collections/MutableList>| = Null(null)!! - R|/list|.R|kotlin/collections/plusAssign| kotlin/String|>(fun (it: R|kotlin/String|): R|kotlin/String| { + R|/list|.R|kotlin/collections/plusAssign| kotlin/String|>(fun (it: R|kotlin/String|): R|kotlin/String| { ^ R|/it| } ) @@ -18,7 +18,7 @@ FILE: plusAssignWithLambdaInRhs.kt public final fun postpone(computation: R|() -> T|): R|A| { lval queue: R|kotlin/collections/MutableList>| = R|kotlin/collections/mutableListOf| kotlin/Unit|>() ^postpone R|/A.A|( = A@fun (resolve: R|(T) -> kotlin/Unit|): R|kotlin/Unit| { - R|/queue|.R|kotlin/collections/plusAssign| kotlin/Unit|>(fun (): R|kotlin/Unit| { + R|/queue|.R|kotlin/collections/plusAssign| kotlin/Unit|>(fun (): R|kotlin/Unit| { R|/resolve|.R|SubstitutionOverride|(R|/computation|.R|SubstitutionOverride|()) } ) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt index c1c5515ed52..d7a1122417d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt @@ -62,6 +62,9 @@ object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() { } private fun isReturnAllowed(targetSymbol: FirFunctionSymbol<*>, context: CheckerContext): Boolean { + if (context.containingDeclarations.lastOrNull() is FirValueParameter) { + return false + } for (containingDeclaration in context.containingDeclarations.asReversed()) { when (containingDeclaration) { // return from member of local class or anonymous object diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index adbaf515de9..3acf8c423e7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -209,7 +209,9 @@ class FirCallCompletionResultsWriterTransformer( (symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda for ((argument, parameter) in newArgumentList.mapping) { val lambda = (argument.unwrapArgument() as? FirAnonymousFunctionExpression)?.anonymousFunction ?: continue + val parameterIsSomeFunction = parameter.returnTypeRef.coneType.isSomeFunctionType(session) val inlineStatus = when { + !parameterIsSomeFunction -> InlineStatus.NoInline parameter.isCrossinline && functionIsInline -> InlineStatus.CrossInline parameter.isNoinline -> InlineStatus.NoInline functionIsInline -> InlineStatus.Inline diff --git a/compiler/testData/diagnostics/tests/controlStructures/kt799.fir.kt b/compiler/testData/diagnostics/tests/controlStructures/kt799.fir.kt index 735cec3ae46..3f3d13edbe6 100644 --- a/compiler/testData/diagnostics/tests/controlStructures/kt799.fir.kt +++ b/compiler/testData/diagnostics/tests/controlStructures/kt799.fir.kt @@ -19,7 +19,7 @@ val b = return 1 val c = doSmth(if (true) 3 else return) -fun f(mi: Int = if (true) 0 else return) {} +fun f(mi: Int = if (true) 0 else return) {} fun doSmth(i: Int) { } diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt index 827eb0eeb58..822be5543dc 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt @@ -1,7 +1,7 @@ fun box() : String { test { - return@box "123" + return@box "123" } return "OK" diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt deleted file mode 100644 index e0f80a40b85..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -fun box() : String { - test { - return@box "123" - } - - return "OK" -} - -inline fun test(p: Any) { - p.toString() -} diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.kt index 44118e915a2..769edd0065d 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun box() : String { test { return@box "123"