[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| {
|
public final fun testGeneric(): R|kotlin/Unit| {
|
||||||
lvar x: R|kotlin/String?| = String()
|
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)
|
R|<local>/x| = Null(null)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Vendored
+1
-1
@@ -121,7 +121,7 @@ digraph plusAssignWithLambdaInRhs_kt {
|
|||||||
46 [label="Postponed exit from lambda"];
|
46 [label="Postponed exit from lambda"];
|
||||||
47 [label="Function call: R|/A.A|<R|T|>(...)" style="filled" fillcolor=yellow];
|
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> {
|
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|>|())
|
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
|
FILE: plusAssignWithLambdaInRhs.kt
|
||||||
public final fun test(): R|kotlin/Unit| {
|
public final fun test(): R|kotlin/Unit| {
|
||||||
lval list: R|kotlin/collections/MutableList<kotlin/Function1<kotlin/String, kotlin/String>>| = Null(null)!!
|
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|
|
^ R|<local>/it|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -18,7 +18,7 @@ FILE: plusAssignWithLambdaInRhs.kt
|
|||||||
public final fun <T> postpone(computation: R|() -> T|): R|A<T>| {
|
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|>()
|
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> {
|
^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|>|())
|
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 {
|
private fun isReturnAllowed(targetSymbol: FirFunctionSymbol<*>, context: CheckerContext): Boolean {
|
||||||
|
if (context.containingDeclarations.lastOrNull() is FirValueParameter) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
for (containingDeclaration in context.containingDeclarations.asReversed()) {
|
for (containingDeclaration in context.containingDeclarations.asReversed()) {
|
||||||
when (containingDeclaration) {
|
when (containingDeclaration) {
|
||||||
// return from member of local class or anonymous object
|
// return from member of local class or anonymous object
|
||||||
|
|||||||
+2
@@ -209,7 +209,9 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
(symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda
|
(symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda
|
||||||
for ((argument, parameter) in newArgumentList.mapping) {
|
for ((argument, parameter) in newArgumentList.mapping) {
|
||||||
val lambda = (argument.unwrapArgument() as? FirAnonymousFunctionExpression)?.anonymousFunction ?: continue
|
val lambda = (argument.unwrapArgument() as? FirAnonymousFunctionExpression)?.anonymousFunction ?: continue
|
||||||
|
val parameterIsSomeFunction = parameter.returnTypeRef.coneType.isSomeFunctionType(session)
|
||||||
val inlineStatus = when {
|
val inlineStatus = when {
|
||||||
|
!parameterIsSomeFunction -> InlineStatus.NoInline
|
||||||
parameter.isCrossinline && functionIsInline -> InlineStatus.CrossInline
|
parameter.isCrossinline && functionIsInline -> InlineStatus.CrossInline
|
||||||
parameter.isNoinline -> InlineStatus.NoInline
|
parameter.isNoinline -> InlineStatus.NoInline
|
||||||
functionIsInline -> InlineStatus.Inline
|
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<!>)
|
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) {
|
fun doSmth(i: Int) {
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
fun box() : String {
|
fun box() : String {
|
||||||
test {
|
test {
|
||||||
return@box "123"
|
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
|
||||||
}
|
}
|
||||||
|
|
||||||
return "OK"
|
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 {
|
fun box() : String {
|
||||||
test {
|
test {
|
||||||
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
|
<!RETURN_NOT_ALLOWED!>return@box<!> "123"
|
||||||
|
|||||||
Reference in New Issue
Block a user