summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala27
-rw-r--r--test/files/neg/t4283b.check4
-rw-r--r--test/files/neg/t4283b/AbstractFoo.java5
-rw-r--r--test/files/neg/t4283b/ScalaBipp.scala (renamed from test/pending/run/t4283/ScalaBipp.scala)0
-rw-r--r--test/files/neg/t4283b/Test.scala3
-rw-r--r--test/files/run/t4283.check5
-rw-r--r--test/files/run/t4283/AbstractFoo.java (renamed from test/pending/run/t4283/AbstractFoo.java)0
-rw-r--r--test/files/run/t4283/ScalaBipp.scala5
-rw-r--r--test/files/run/t4283/Test.scala (renamed from test/pending/run/t4283/IllegalAccess.scala)5
-rw-r--r--test/files/run/t5162.scala19
10 files changed, 61 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index ce16facf77..1276d62995 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -1042,18 +1042,27 @@ abstract class Erasure extends AddInterfaces
assert(overridden != NoSymbol, tree.symbol)
tree.symbol = overridden
}
+
def isAccessible(sym: Symbol) = localTyper.context.isAccessible(sym, sym.owner.thisType)
if (!isAccessible(owner) && qual.tpe != null) {
- // Todo: Figure out how qual.tpe could be null in the check above (it does appear in build where SwingWorker.this
- // has a null type).
- val qualSym = qual.tpe.widen.typeSymbol
- if (isAccessible(qualSym) && !qualSym.isPackageClass && !qualSym.isPackageObjectClass) {
- // insert cast to prevent illegal access error (see #4283)
- // util.trace("insert erasure cast ") (*/
- treeCopy.Select(tree, gen.mkAttributedCast(qual, qual.tpe.widen), name) //)
- } else tree
+ qual match {
+ case Super(_, _) =>
+ // Insert a cast here at your peril -- see SI-5162. Bail out if the target method is defined in
+ // Java, otherwise, we'd get an IllegalAccessError at runtime. If the target method is defined in
+ // Scala, however, we should have access.
+ if (owner.isJavaDefined) unit.error(tree.pos, s"Unable to access ${tree.symbol.fullLocationString} with a super reference.")
+ tree
+ case _ =>
+ // Todo: Figure out how qual.tpe could be null in the check above (it does appear in build where SwingWorker.this
+ // has a null type).
+ val qualSym = qual.tpe.widen.typeSymbol
+ if (isAccessible(qualSym) && !qualSym.isPackageClass && !qualSym.isPackageObjectClass) {
+ // insert cast to prevent illegal access error (see #4283)
+ // util.trace("insert erasure cast ") (*/
+ treeCopy.Select(tree, gen.mkAttributedCast(qual, qual.tpe.widen), name) //)
+ } else tree
+ }
} else tree
-
case Template(parents, self, body) =>
assert(!currentOwner.isImplClass)
//Console.println("checking no dble defs " + tree)//DEBUG
diff --git a/test/files/neg/t4283b.check b/test/files/neg/t4283b.check
new file mode 100644
index 0000000000..30d03a310d
--- /dev/null
+++ b/test/files/neg/t4283b.check
@@ -0,0 +1,4 @@
+Test.scala:2: error: Unable to access method f in class AbstractFoo with a super reference.
+ override def f(): Int = super.f()
+ ^
+one error found
diff --git a/test/files/neg/t4283b/AbstractFoo.java b/test/files/neg/t4283b/AbstractFoo.java
new file mode 100644
index 0000000000..7abcd5e76b
--- /dev/null
+++ b/test/files/neg/t4283b/AbstractFoo.java
@@ -0,0 +1,5 @@
+package test;
+
+/* package private */ class AbstractFoo {
+ public int f() { return 2; }
+}
diff --git a/test/pending/run/t4283/ScalaBipp.scala b/test/files/neg/t4283b/ScalaBipp.scala
index 36dea9f4de..36dea9f4de 100644
--- a/test/pending/run/t4283/ScalaBipp.scala
+++ b/test/files/neg/t4283b/ScalaBipp.scala
diff --git a/test/files/neg/t4283b/Test.scala b/test/files/neg/t4283b/Test.scala
new file mode 100644
index 0000000000..0dc5636ff8
--- /dev/null
+++ b/test/files/neg/t4283b/Test.scala
@@ -0,0 +1,3 @@
+object Derived extends test.ScalaBipp {
+ override def f(): Int = super.f()
+}
diff --git a/test/files/run/t4283.check b/test/files/run/t4283.check
new file mode 100644
index 0000000000..0d27989761
--- /dev/null
+++ b/test/files/run/t4283.check
@@ -0,0 +1,5 @@
+2
+2
+1
+1
+1
diff --git a/test/pending/run/t4283/AbstractFoo.java b/test/files/run/t4283/AbstractFoo.java
index 0403271b74..0403271b74 100644
--- a/test/pending/run/t4283/AbstractFoo.java
+++ b/test/files/run/t4283/AbstractFoo.java
diff --git a/test/files/run/t4283/ScalaBipp.scala b/test/files/run/t4283/ScalaBipp.scala
new file mode 100644
index 0000000000..36dea9f4de
--- /dev/null
+++ b/test/files/run/t4283/ScalaBipp.scala
@@ -0,0 +1,5 @@
+package test
+
+class ScalaBipp extends AbstractFoo {
+ def make: Option[ScalaBipp] = Option(this)
+}
diff --git a/test/pending/run/t4283/IllegalAccess.scala b/test/files/run/t4283/Test.scala
index 33039c9350..af72fa62f9 100644
--- a/test/pending/run/t4283/IllegalAccess.scala
+++ b/test/files/run/t4283/Test.scala
@@ -1,8 +1,7 @@
-package other
+object Test {
-object IllegalAccess {
def main(args: Array[String]) {
- val x = (new test.ScalaBipp).make.get.asInstanceOf[test.ScalaBipp].f()
+ val x = (new test.ScalaBipp).make.get.asInstanceOf[test.ScalaBipp].f()
println(x)
val y = (new test.ScalaBipp).make.get.f()
println(y)
diff --git a/test/files/run/t5162.scala b/test/files/run/t5162.scala
new file mode 100644
index 0000000000..4f91932b6e
--- /dev/null
+++ b/test/files/run/t5162.scala
@@ -0,0 +1,19 @@
+// In run, rather than pos, to check for problems like SI-4283
+object O1 {
+ private[O1] class Base {
+ def foo: Int = 0
+ }
+ class Mediator extends Base
+}
+
+object O2 {
+ class Derived extends O1.Mediator {
+ override def foo: Int = super.foo
+ }
+}
+
+object Test {
+ def main(args: Array[String]) {
+ new O2.Derived().foo
+ }
+}