Error diagnostic for private classes in inline functions; Fix for KT-7545: IllegalAccessError when accessing private nested class through inlined function from different package
#KT-7545 Fixed
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
import test.*
|
||||
|
||||
fun box(): String {
|
||||
return call {
|
||||
"O"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package test
|
||||
|
||||
private class S public constructor() {
|
||||
class Z {
|
||||
fun a(): String {
|
||||
return "K"
|
||||
}
|
||||
}
|
||||
}
|
||||
// This function exposes S.Z which is a class nested into a private class S (package-private in the byte code)
|
||||
// It can be accessed outside the `test` package now that S.Z. is public in the byte code, but it may be changed later
|
||||
internal inline fun call(s: () -> String): String {
|
||||
return s() + test().a()
|
||||
}
|
||||
|
||||
private fun test(): S.Z {
|
||||
return S.Z()
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import test.*
|
||||
|
||||
fun box(): String {
|
||||
return call {
|
||||
"O"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package test
|
||||
|
||||
private class S {
|
||||
fun a(): String {
|
||||
return "K"
|
||||
}
|
||||
}
|
||||
|
||||
// This function exposes S which is a private class (package-private in the byte code)
|
||||
// It can be accessed outside the `test` package, which may lead to IllegalAccessError.
|
||||
// This behavior may be changed later
|
||||
internal inline fun call(s: () -> String): String {
|
||||
val s = test()
|
||||
return s() + test2(s)
|
||||
}
|
||||
|
||||
private fun test(): S {
|
||||
return S()
|
||||
}
|
||||
|
||||
private fun test2(s: S): String {
|
||||
return s.a()
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import test.*
|
||||
|
||||
fun box(): String {
|
||||
return call()
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package test
|
||||
|
||||
private class S {
|
||||
fun a(): String {
|
||||
return "K"
|
||||
}
|
||||
|
||||
// This function exposes S which is a private class (package-private in the byte code)
|
||||
// It can be accessed outside the `test` package, which may lead to IllegalAccessError.
|
||||
// This behavior may be changed later
|
||||
internal inline fun call(s: S.() -> String): String {
|
||||
return call2(s)
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("PRIVATE_CLASS_MEMBER_FROM_INLINE", "EXPOSED_PARAMETER_TYPE", "EXPOSED_RECEIVER_TYPE")
|
||||
internal inline fun S.call2(s: S.() -> String): String {
|
||||
return s() + a()
|
||||
}
|
||||
|
||||
internal fun call(): String {
|
||||
return S().call {
|
||||
"O"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user