diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/opt/Inliners.scala | 15 | ||||
-rw-r--r-- | test/files/run/t7582.check | 2 | ||||
-rw-r--r-- | test/files/run/t7582.flags | 1 | ||||
-rw-r--r-- | test/files/run/t7582/InlineHolder.scala | 16 | ||||
-rw-r--r-- | test/files/run/t7582/PackageProtectedJava.java | 6 | ||||
-rw-r--r-- | test/files/run/t7582b.check | 2 | ||||
-rw-r--r-- | test/files/run/t7582b.flags | 1 | ||||
-rw-r--r-- | test/files/run/t7582b/InlineHolder.scala | 16 | ||||
-rw-r--r-- | test/files/run/t7582b/PackageProtectedJava.java | 6 |
9 files changed, 62 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala index a6eedbd07e..56191cc981 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala @@ -679,9 +679,18 @@ abstract class Inliners extends SubComponent { } */ - def checkField(f: Symbol) = check(f, f.isPrivate && !canMakePublic(f)) - def checkSuper(n: Symbol) = check(n, n.isPrivate || !n.isClassConstructor) - def checkMethod(n: Symbol) = check(n, n.isPrivate) + + def isPrivateForInlining(sym: Symbol): Boolean = { + if (sym.isJavaDefined) { + def check(sym: Symbol) = !(sym.isPublic || sym.isProtected) + check(sym) || check(sym.owner) // SI-7582 Must check the enclosing class *and* the symbol for Java. + } + else sym.isPrivate // Scala never emits package-private bytecode + } + + def checkField(f: Symbol) = check(f, isPrivateForInlining(f) && !canMakePublic(f)) + def checkSuper(n: Symbol) = check(n, isPrivateForInlining(n) || !n.isClassConstructor) + def checkMethod(n: Symbol) = check(n, isPrivateForInlining(n)) def getAccess(i: Instruction) = i match { case CALL_METHOD(n, SuperCall(_)) => checkSuper(n) diff --git a/test/files/run/t7582.check b/test/files/run/t7582.check new file mode 100644 index 0000000000..225fb1ace8 --- /dev/null +++ b/test/files/run/t7582.check @@ -0,0 +1,2 @@ +warning: there were 1 inliner warning(s); re-run with -Yinline-warnings for details +2 diff --git a/test/files/run/t7582.flags b/test/files/run/t7582.flags new file mode 100644 index 0000000000..1182725e86 --- /dev/null +++ b/test/files/run/t7582.flags @@ -0,0 +1 @@ +-optimize
\ No newline at end of file diff --git a/test/files/run/t7582/InlineHolder.scala b/test/files/run/t7582/InlineHolder.scala new file mode 100644 index 0000000000..a18b9effaa --- /dev/null +++ b/test/files/run/t7582/InlineHolder.scala @@ -0,0 +1,16 @@ +package p1 { + object InlineHolder { + @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1 + } +} + +object O { + @noinline + def x = p1.InlineHolder.inlinable +} + +object Test { + def main(args: Array[String]) { + println(O.x) + } +} diff --git a/test/files/run/t7582/PackageProtectedJava.java b/test/files/run/t7582/PackageProtectedJava.java new file mode 100644 index 0000000000..b7ea2a7676 --- /dev/null +++ b/test/files/run/t7582/PackageProtectedJava.java @@ -0,0 +1,6 @@ +package p1; + +// public class, protected method +public class PackageProtectedJava { + static final int protectedMethod() { return 1; } +} diff --git a/test/files/run/t7582b.check b/test/files/run/t7582b.check new file mode 100644 index 0000000000..225fb1ace8 --- /dev/null +++ b/test/files/run/t7582b.check @@ -0,0 +1,2 @@ +warning: there were 1 inliner warning(s); re-run with -Yinline-warnings for details +2 diff --git a/test/files/run/t7582b.flags b/test/files/run/t7582b.flags new file mode 100644 index 0000000000..1182725e86 --- /dev/null +++ b/test/files/run/t7582b.flags @@ -0,0 +1 @@ +-optimize
\ No newline at end of file diff --git a/test/files/run/t7582b/InlineHolder.scala b/test/files/run/t7582b/InlineHolder.scala new file mode 100644 index 0000000000..a18b9effaa --- /dev/null +++ b/test/files/run/t7582b/InlineHolder.scala @@ -0,0 +1,16 @@ +package p1 { + object InlineHolder { + @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1 + } +} + +object O { + @noinline + def x = p1.InlineHolder.inlinable +} + +object Test { + def main(args: Array[String]) { + println(O.x) + } +} diff --git a/test/files/run/t7582b/PackageProtectedJava.java b/test/files/run/t7582b/PackageProtectedJava.java new file mode 100644 index 0000000000..55a44b79f9 --- /dev/null +++ b/test/files/run/t7582b/PackageProtectedJava.java @@ -0,0 +1,6 @@ +package p1; + +// protected class, public method +class PackageProtectedJava { + public static final int protectedMethod() { return 1; } +} |