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:
Michael Bogdanov
2016-02-02 13:56:02 +03:00
parent 71c2a6e792
commit d1db404959
19 changed files with 200 additions and 12 deletions
@@ -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"
}
}
@@ -1,4 +1,4 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -INVISIBLE_PRIVATE_CLASS_MEMBER_FROM_INLINE
private class Z public constructor(){
public val publicProperty:Int = 12
public fun publicFun() {}
@@ -14,7 +14,7 @@ internal inline fun testInternal() {
Z().publicFun()
}
private class Z2 {
internal class Z2 {
private val privateProperty = 11;
public val publicProperty:Int = 12
@@ -34,7 +34,7 @@ private class Z2 {
Z2().privateFun()
}
inline fun testInternal() {
internal inline fun testInternal() {
privateProperty
privateFun()
publicProperty
@@ -12,7 +12,7 @@ private final class Z {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
private final class Z2 {
internal final class Z2 {
public constructor Z2()
private final val privateProperty: kotlin.Int = 11
public final val publicProperty: kotlin.Int = 12
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
private class Z2 {
internal class Z2 {
private val privateProperty = 11;
public val publicProperty:Int = 12
@@ -8,7 +8,7 @@ private class Z2 {
public fun publicFun() {}
private inner class ZInner {
internal inner class ZInner {
public inline fun test() {
privateProperty
privateFun()
@@ -21,7 +21,7 @@ private class Z2 {
Z2().privateFun()
}
inline fun testInternal() {
internal inline fun testInternal() {
privateProperty
privateFun()
publicFun()
@@ -1,6 +1,6 @@
package
private final class Z2 {
internal final class Z2 {
public constructor Z2()
private final val privateProperty: kotlin.Int = 11
public final val publicProperty: kotlin.Int = 12
@@ -10,7 +10,7 @@ private final class Z2 {
public final fun publicFun(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
private final inner class ZInner {
internal final inner class ZInner {
public constructor ZInner()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -EXPOSED_PARAMETER_TYPE
private class S public constructor() {
fun a() {
}
}
internal inline fun x(s: S, z: () -> Unit) {
z()
<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>S<!>()
s.<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>a<!>()
test()
}
private inline fun x2(s: S, z: () -> Unit) {
z()
S()
s.a()
test()
}
private fun test(): S {
return S()
}
@@ -0,0 +1,12 @@
package
private fun test(): S
private inline fun x(/*0*/ s: S, /*1*/ z: () -> kotlin.Unit): kotlin.Unit
private final class S {
public constructor S()
public final fun a(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}