[FIR] Don't miss RETURN_NOT_ALLOWED

^KT-59914 Fixed
This commit is contained in:
Nikolay Lunyak
2023-09-01 16:20:45 +03:00
committed by Space Team
parent 009cda0c60
commit cd392ebe69
9 changed files with 12 additions and 17 deletions
@@ -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|<R|() -> kotlin/Unit|>(<L> = any@fun <anonymous>(): R|kotlin/Unit| <inline=Inline> {
lval lambda: R|() -> kotlin/Unit| = R|/any|<R|() -> kotlin/Unit|>(<L> = any@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
R|<local>/x| = Null(null)
}
)
@@ -121,7 +121,7 @@ digraph plusAssignWithLambdaInRhs_kt {
46 [label="Postponed exit from lambda"];
47 [label="Function call: R|/A.A|<R|T|>(...)" style="filled" fillcolor=yellow];
48 [label="Jump: ^postpone R|/A.A|<R|T|>(<L> = A@fun <anonymous>(resolve: R|(T) -> kotlin/Unit|): R|kotlin/Unit| <inline=NoInline> {
R|<local>/queue|.R|kotlin/collections/plusAssign|<R|() -> kotlin/Unit|>(fun <anonymous>(): R|kotlin/Unit| <inline=Inline> {
R|<local>/queue|.R|kotlin/collections/plusAssign|<R|() -> kotlin/Unit|>(fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
R|<local>/resolve|.R|SubstitutionOverride<kotlin/Function1.invoke: R|kotlin/Unit|>|(R|<local>/computation|.R|SubstitutionOverride<kotlin/Function0.invoke: R|T|>|())
}
)
@@ -1,7 +1,7 @@
FILE: plusAssignWithLambdaInRhs.kt
public final fun test(): R|kotlin/Unit| {
lval list: R|kotlin/collections/MutableList<kotlin/Function1<kotlin/String, kotlin/String>>| = Null(null)!!
R|<local>/list|.R|kotlin/collections/plusAssign|<R|(kotlin/String) -> kotlin/String|>(fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| <inline=Inline> {
R|<local>/list|.R|kotlin/collections/plusAssign|<R|(kotlin/String) -> kotlin/String|>(fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| <inline=NoInline> {
^ R|<local>/it|
}
)
@@ -18,7 +18,7 @@ FILE: plusAssignWithLambdaInRhs.kt
public final fun <T> postpone(computation: R|() -> T|): R|A<T>| {
lval queue: R|kotlin/collections/MutableList<kotlin/Function0<kotlin/Unit>>| = R|kotlin/collections/mutableListOf|<R|() -> kotlin/Unit|>()
^postpone R|/A.A|<R|T|>(<L> = A@fun <anonymous>(resolve: R|(T) -> kotlin/Unit|): R|kotlin/Unit| <inline=NoInline> {
R|<local>/queue|.R|kotlin/collections/plusAssign|<R|() -> kotlin/Unit|>(fun <anonymous>(): R|kotlin/Unit| <inline=Inline> {
R|<local>/queue|.R|kotlin/collections/plusAssign|<R|() -> kotlin/Unit|>(fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
R|<local>/resolve|.R|SubstitutionOverride<kotlin/Function1.invoke: R|kotlin/Unit|>|(R|<local>/computation|.R|SubstitutionOverride<kotlin/Function0.invoke: R|T|>|())
}
)
@@ -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
@@ -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
@@ -19,7 +19,7 @@ val <!IMPLICIT_NOTHING_PROPERTY_TYPE!>b<!> = <!RETURN_NOT_ALLOWED!>return<!> 1
val c = doSmth(if (true) 3 else <!RETURN_NOT_ALLOWED!>return<!>)
fun f(mi: Int = if (true) 0 else return) {}
fun f(mi: Int = if (true) 0 else <!RETURN_NOT_ALLOWED!>return<!>) {}
fun doSmth(i: Int) {
}
@@ -1,7 +1,7 @@
fun box() : String {
test {
return@box "123"
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
}
return "OK"
@@ -1,11 +0,0 @@
fun box() : String {
test {
return@box "123"
}
return "OK"
}
<!NOTHING_TO_INLINE!>inline<!> fun test(p: Any) {
p.toString()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
fun box() : String {
test {
<!RETURN_NOT_ALLOWED!>return@box<!> "123"