FIR: fix label stealling and crash with multiple labels

Consider the code below

```
fun test() {
  a@ b@ {
    {}
  }
}
```

Currently when the code is converted to FIR, label `b` is bound to the
outer lambda and `a` gets bound to the inner lambda because it's not
consumed. This is wrong and also leads transfromation to fail with
exceptions because of the unexpected consumption of `a`.

This change fixes the above issue by designating a specific node in the
AST as the allowed user of a label when the label is added.
This commit is contained in:
Tianyu Geng
2021-09-23 10:52:13 -07:00
committed by TeamCityServer
parent 5c716ea979
commit fadde98a86
17 changed files with 175 additions and 43 deletions
@@ -51,12 +51,21 @@ fun testLoopLabelInReturn(xs: List<Int>) {
}
fun testValLabelInReturn() {
L@ val fn = { return@L }
L@ val fn = { <!NOT_A_FUNCTION_LABEL!>return@L<!> }
fn()
}
fun testHighOrderFunctionCallLabelInReturn() {
L@ run {
return@L
<!NOT_A_FUNCTION_LABEL!>return@L<!>
}
}
fun testMultipleLabelsWithNestedLambda() {
l1@ l2@{
{
<!NOT_A_FUNCTION_LABEL!>return@l1<!>
}
return@l2
}
}