From fe5a6fd51166487ba90b95eebbc2f13ffd5e5992 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Fri, 9 Sep 2022 19:24:02 +0200 Subject: [PATCH] Disallow non-local break/continue in crossinline lambdas --- ...CompilerTestFE10TestdataTestGenerated.java | 12 +++++++ ...irOldFrontendDiagnosticsTestGenerated.java | 12 +++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++++ ...tinueJumpsAcrossFunctionBoundaryChecker.kt | 4 ++- .../runners/ir/Fir2IrTextTestGenerated.java | 6 ---- .../ir/LightTreeFir2IrTextTestGenerated.java | 6 ---- .../bindingContextUtil/BindingContextUtils.kt | 2 +- .../breakContinueInCrossInlineLambda.kt | 18 +++++++++++ .../breakContinueInCrossInlineLambda.txt | 4 +++ .../breakContinueInNoInlineLambda.kt | 18 +++++++++++ .../breakContinueInNoInlineLambda.txt | 4 +++ .../badInlinedBreakContinue.ir.txt | 15 +++++++++ .../expressions/badInlinedBreakContinue.kt | 9 +++++- .../badInlinedBreakContinue.kt.txt | 13 ++++++++ .../breakContinueInNoInlineLambda.ir.txt | 32 ------------------- .../breakContinueInNoInlineLambda.kt | 20 ------------ .../breakContinueInNoInlineLambda.kt.txt | 24 -------------- .../test/runners/DiagnosticTestGenerated.java | 12 +++++++ .../test/runners/ir/IrTextTestGenerated.java | 6 ---- .../klib/KlibTextTestCaseGenerated.java | 5 +++ 20 files changed, 137 insertions(+), 97 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt create mode 100644 compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.txt create mode 100644 compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt create mode 100644 compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.txt delete mode 100644 compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.ir.txt delete mode 100644 compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt delete mode 100644 compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index a0304a72f7c..f5b0410e5d7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -6290,6 +6290,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/controlStructures"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("breakContinueInCrossInlineLambda.kt") + public void testBreakContinueInCrossInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt"); + } + + @Test + @TestMetadata("breakContinueInNoInlineLambda.kt") + public void testBreakContinueInNoInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt"); + } + @Test @TestMetadata("breakToLabel.kt") public void testBreakToLabel() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index c5c1d737683..b3adf471d4f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -6290,6 +6290,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/controlStructures"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("breakContinueInCrossInlineLambda.kt") + public void testBreakContinueInCrossInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt"); + } + + @Test + @TestMetadata("breakContinueInNoInlineLambda.kt") + public void testBreakContinueInNoInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt"); + } + @Test @TestMetadata("breakToLabel.kt") public void testBreakToLabel() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 41ea9074130..95fefeec855 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -6290,6 +6290,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/controlStructures"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("breakContinueInCrossInlineLambda.kt") + public void testBreakContinueInCrossInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt"); + } + + @Test + @TestMetadata("breakContinueInNoInlineLambda.kt") + public void testBreakContinueInNoInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt"); + } + @Test @TestMetadata("breakToLabel.kt") public void testBreakToLabel() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirBreakOrContinueJumpsAcrossFunctionBoundaryChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirBreakOrContinueJumpsAcrossFunctionBoundaryChecker.kt index 85259a56e9b..40ca7c0cfd7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirBreakOrContinueJumpsAcrossFunctionBoundaryChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirBreakOrContinueJumpsAcrossFunctionBoundaryChecker.kt @@ -67,7 +67,9 @@ object FirBreakOrContinueJumpsAcrossFunctionBoundaryChecker : FirLoopJumpChecker val symbol = if (allowInlined) element.calleeReference.resolvedSymbol as? FirFunctionSymbol else null element.arguments.forEachIndexed { i, argument -> val expressionToCheck = - if (symbol?.resolvedStatus?.isInline == true && !symbol.valueParameterSymbols[i].isNoinline) argument.tryInline() else argument + if (symbol?.resolvedStatus?.isInline == true + && !symbol.valueParameterSymbols[i].run { isNoinline || isCrossinline } + ) argument.tryInline() else argument if (findPathAndCheck(expressionToCheck)) { return true } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index c52f25846b2..aec53012a9e 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -1250,12 +1250,6 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/expressions/breakContinueInLoopHeader.kt"); } - @Test - @TestMetadata("breakContinueInNoInlineLambda.kt") - public void testBreakContinueInNoInlineLambda() throws Exception { - runTest("compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt"); - } - @Test @TestMetadata("breakContinueInWhen.kt") public void testBreakContinueInWhen() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index a8f56b08579..dde66762469 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -1250,12 +1250,6 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/expressions/breakContinueInLoopHeader.kt"); } - @Test - @TestMetadata("breakContinueInNoInlineLambda.kt") - public void testBreakContinueInNoInlineLambda() throws Exception { - runTest("compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt"); - } - @Test @TestMetadata("breakContinueInWhen.kt") public void testBreakContinueInWhen() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/bindingContextUtil/BindingContextUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/bindingContextUtil/BindingContextUtils.kt index 030af2c0234..0c0f9be1ef0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/bindingContextUtil/BindingContextUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/bindingContextUtil/BindingContextUtils.kt @@ -197,7 +197,7 @@ fun isInlineableFunctionLiteral(expression: KtExpression, context: BindingContex val parameter = resolvedCall.valueArguments.entries.find { (_, valueArgument) -> valueArgument.arguments.any { it.asElement() == argument } }?.key ?: return false - return !parameter.isNoinline + return !parameter.isNoinline && !parameter.isCrossinline } return false diff --git a/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt new file mode 100644 index 00000000000..21932e2189c --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt @@ -0,0 +1,18 @@ +// FIR_IDENTICAL +// LANGUAGE: +BreakContinueInInlineLambdas + + +inline fun foo(crossinline block: () -> Unit) = block() + + +fun test1() { + L1@ while (true) { + foo { break } + + foo { break@L1 } + + foo { continue } + + foo { continue@L1 } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.txt b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.txt new file mode 100644 index 00000000000..2e7051361f1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.txt @@ -0,0 +1,4 @@ +package + +public inline fun foo(/*0*/ crossinline block: () -> kotlin.Unit): kotlin.Unit +public fun test1(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt new file mode 100644 index 00000000000..94fc6c93293 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt @@ -0,0 +1,18 @@ +// FIR_IDENTICAL +// LANGUAGE: +BreakContinueInInlineLambdas + + +inline fun foo(noinline block: () -> Unit) = block() + + +fun test1() { + L1@ while (true) { + foo { break } + + foo { break@L1 } + + foo { continue } + + foo { continue@L1 } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.txt b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.txt new file mode 100644 index 00000000000..0ef7ee94f24 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.txt @@ -0,0 +1,4 @@ +package + +public inline fun foo(/*0*/ noinline block: () -> kotlin.Unit): kotlin.Unit +public fun test1(): kotlin.Unit diff --git a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.ir.txt b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.ir.txt index 3e4f5ee7550..532cdd809ca 100644 --- a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.ir.txt +++ b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.ir.txt @@ -12,6 +12,11 @@ FILE fqName: fileName:/badInlinedBreakContinue.kt $this: GET_VAR 'block1: kotlin.Function0 declared in .bar' type=kotlin.Function0 origin=VARIABLE_AS_FUNCTION CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=kotlin.Unit origin=INVOKE $this: GET_VAR 'block2: kotlin.Function0 [noinline] declared in .bar' type=kotlin.Function0 origin=VARIABLE_AS_FUNCTION + FUN name:baz visibility:public modality:FINAL <> (block:kotlin.Function0) returnType:kotlin.Unit [inline] + VALUE_PARAMETER name:block index:0 type:kotlin.Function0 [crossinline] + BLOCK_BODY + CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=kotlin.Unit origin=INVOKE + $this: GET_VAR 'block: kotlin.Function0 [crossinline] declared in .baz' type=kotlin.Function0 origin=VARIABLE_AS_FUNCTION FUN name:myForEach visibility:public modality:FINAL ($receiver:kotlin.collections.Iterable.myForEach>, action:kotlin.Function1.myForEach, kotlin.Unit>) returnType:kotlin.Unit [inline] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] reified:false $receiver: VALUE_PARAMETER name: type:kotlin.collections.Iterable.myForEach> @@ -342,3 +347,13 @@ FILE fqName: fileName:/badInlinedBreakContinue.kt arg1: CONST Int type=kotlin.Int value=2 then: BLOCK type=kotlin.Unit origin=null ERROR_EXPR 'Loop not found for break expression: break' type=kotlin.Nothing + FUN name:test8 visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + WHILE label=null origin=WHILE_LOOP + condition: CONST Boolean type=kotlin.Boolean value=true + body: BLOCK type=kotlin.Unit origin=null + CALL 'public final fun baz (block: kotlin.Function0): kotlin.Unit [inline] declared in ' type=kotlin.Unit origin=null + block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA + FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + ERROR_EXPR 'Loop not found for break expression: break' type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt index 243e2f28b2b..f8099036a6d 100644 --- a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt +++ b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt @@ -1,5 +1,4 @@ // LANGUAGE: +BreakContinueInInlineLambdas -// TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR // !IGNORE_ERRORS // WITH_STDLIB @@ -11,6 +10,8 @@ inline fun bar(block1: () -> Unit, noinline block2: () -> Unit) { block2() } +inline fun baz(crossinline block: () -> Unit) { block() } + inline fun Iterable.myForEach(action: (T) -> Unit): Unit { for (element in this) action(element) } @@ -108,4 +109,10 @@ fun test7() { break } } +} + +fun test8() { + while (true) { + baz({break}) + } } \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt.txt b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt.txt index d90a47bca5c..182cf672ea3 100644 --- a/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt.txt +++ b/compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt.txt @@ -7,6 +7,10 @@ inline fun bar(block1: Function0, noinline block2: Function0) { block2.invoke() } +inline fun baz(crossinline block: Function0) { + block.invoke() +} + inline fun Iterable.myForEach(action: Function1) { { // BLOCK val tmp0_iterator: Iterator = .iterator() @@ -220,3 +224,12 @@ fun test7() { ) } +fun test8() { + while (true) { // BLOCK + baz(block = local fun () { + error("") /* ErrorExpression */ + } +) + } +} + diff --git a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.ir.txt b/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.ir.txt deleted file mode 100644 index 970a153dee7..00000000000 --- a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.ir.txt +++ /dev/null @@ -1,32 +0,0 @@ -FILE fqName: fileName:/breakContinueInNoInlineLambda.kt - FUN name:foo visibility:public modality:FINAL <> (block:kotlin.Function0) returnType:kotlin.Unit [inline] - VALUE_PARAMETER name:block index:0 type:kotlin.Function0 [noinline] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun foo (block: kotlin.Function0): kotlin.Unit [inline] declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=kotlin.Unit origin=INVOKE - $this: GET_VAR 'block: kotlin.Function0 [noinline] declared in .foo' type=kotlin.Function0 origin=VARIABLE_AS_FUNCTION - FUN name:test1 visibility:public modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - WHILE label=L1 origin=WHILE_LOOP - condition: CONST Boolean type=kotlin.Boolean value=true - body: BLOCK type=kotlin.Unit origin=null - CALL 'public final fun foo (block: kotlin.Function0): kotlin.Unit [inline] declared in ' type=kotlin.Unit origin=null - block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - ERROR_EXPR 'Loop not found for break expression: break' type=kotlin.Nothing - CALL 'public final fun foo (block: kotlin.Function0): kotlin.Unit [inline] declared in ' type=kotlin.Unit origin=null - block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - ERROR_EXPR 'Loop not found for break expression: break@L1' type=kotlin.Nothing - CALL 'public final fun foo (block: kotlin.Function0): kotlin.Unit [inline] declared in ' type=kotlin.Unit origin=null - block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - ERROR_EXPR 'Loop not found for continue expression: continue' type=kotlin.Nothing - CALL 'public final fun foo (block: kotlin.Function0): kotlin.Unit [inline] declared in ' type=kotlin.Unit origin=null - block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - ERROR_EXPR 'Loop not found for continue expression: continue@L1' type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt b/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt deleted file mode 100644 index 194dda9f371..00000000000 --- a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt +++ /dev/null @@ -1,20 +0,0 @@ -// LANGUAGE: +BreakContinueInInlineLambdas -// TARGET_BACKEND: JVM_IR -// IGNORE_BACKEND_FIR: JVM_IR -// !IGNORE_ERRORS - - -inline fun foo(noinline block: () -> Unit) = block() - - -fun test1() { - L1@ while (true) { - foo { break } - - foo { break@L1 } - - foo { continue } - - foo { continue@L1 } - } -} \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt.txt b/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt.txt deleted file mode 100644 index 551199a55dc..00000000000 --- a/compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt.txt +++ /dev/null @@ -1,24 +0,0 @@ -inline fun foo(noinline block: Function0) { - return block.invoke() -} - -fun test1() { - L1@ while (true) { // BLOCK - foo(block = local fun () { - error("") /* ErrorExpression */ - } -) - foo(block = local fun () { - error("") /* ErrorExpression */ - } -) - foo(block = local fun () { - error("") /* ErrorExpression */ - } -) - foo(block = local fun () { - error("") /* ErrorExpression */ - } -) - } -} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index aa2c138fb80..ae6d2e6c1ae 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -6296,6 +6296,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/controlStructures"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("breakContinueInCrossInlineLambda.kt") + public void testBreakContinueInCrossInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInCrossInlineLambda.kt"); + } + + @Test + @TestMetadata("breakContinueInNoInlineLambda.kt") + public void testBreakContinueInNoInlineLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/controlStructures/breakContinueInNoInlineLambda.kt"); + } + @Test @TestMetadata("breakToLabel.kt") public void testBreakToLabel() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 2b6f4f460f4..e419b8efddc 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -1250,12 +1250,6 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/expressions/breakContinueInLoopHeader.kt"); } - @Test - @TestMetadata("breakContinueInNoInlineLambda.kt") - public void testBreakContinueInNoInlineLambda() throws Exception { - runTest("compiler/testData/ir/irText/expressions/breakContinueInNoInlineLambda.kt"); - } - @Test @TestMetadata("breakContinueInWhen.kt") public void testBreakContinueInWhen() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java index 6c919a03845..964d942b322 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java @@ -922,6 +922,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/expressions/badBreakContinue.kt"); } + @TestMetadata("badInlinedBreakContinue.kt") + public void testBadInlinedBreakContinue() throws Exception { + runTest("compiler/testData/ir/irText/expressions/badInlinedBreakContinue.kt"); + } + @TestMetadata("bangbang.kt") public void testBangbang() throws Exception { runTest("compiler/testData/ir/irText/expressions/bangbang.kt");