fun test1(str: String): String { data class A(val x: Int) { fun foo() = str } return A(0).copy().foo() } class TestClass(val x: String) { fun foo(): String { data class A(val x: Int) { fun foo() = this@TestClass.x } return A(0).copy().foo() } } fun test2(str: String): String = TestClass(str).foo() fun test3(str: String): String { var xx = "" data class A(val x: Int) { fun foo(): String { xx = str; return xx } } return A(0).copy().foo() } fun test4(str: String): String { var xx = "" fun bar(s: String): String { xx = s; return xx } data class A(val x: Int) { fun foo(): String = bar(str) } return A(0).copy().foo() } fun box(): String { return when { test1("test1") != "test1" -> "Failed #1 (parameter capture)" test2("test2") != "test2" -> "Failed #2 ('this' capture)" test3("test3") != "test3" -> "Failed #3 ('var' capture)" test4("test4") != "test4" -> "Failed #4 (local function capture)" else -> "OK" } }