[FIR] Don't miss RETURN_NOT_ALLOWED
^KT-59914 Fixed
This commit is contained in:
committed by
Space Team
parent
009cda0c60
commit
cd392ebe69
+1
-1
@@ -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)
|
||||
}
|
||||
)
|
||||
|
||||
Vendored
+1
-1
@@ -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|>|())
|
||||
}
|
||||
)
|
||||
|
||||
Vendored
+2
-2
@@ -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|>|())
|
||||
}
|
||||
)
|
||||
|
||||
+3
@@ -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
|
||||
|
||||
+2
@@ -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
-1
@@ -1,7 +1,7 @@
|
||||
|
||||
fun box() : String {
|
||||
test {
|
||||
return@box "123"
|
||||
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
|
||||
}
|
||||
|
||||
return "OK"
|
||||
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
fun box() : String {
|
||||
test {
|
||||
return@box "123"
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
<!NOTHING_TO_INLINE!>inline<!> fun test(p: Any) {
|
||||
p.toString()
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
fun box() : String {
|
||||
test {
|
||||
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
|
||||
|
||||
Reference in New Issue
Block a user