summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala14
-rwxr-xr-xtest/files/run/t2946/Parsers.scala4
-rwxr-xr-xtest/files/run/t2946/ResponseCommon.scala14
-rwxr-xr-xtest/files/run/t2946/Test.scala7
4 files changed, 34 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
index 5b1093d7c9..518602fe87 100644
--- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
+++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
@@ -105,12 +105,9 @@ abstract class ExplicitOuter extends InfoTransform
def transformInfo(sym: Symbol, tp: Type): Type = tp match {
case MethodType(params, restpe1) =>
val restpe = transformInfo(sym, restpe1)
- if (sym.owner.isTrait && ((sym hasFlag SUPERACCESSOR) || sym.isModule)) { // 5
+ if (sym.owner.isTrait && ((sym hasFlag (ACCESSOR | SUPERACCESSOR)) || sym.isModule)) { // 5
sym.makeNotPrivate(sym.owner)
}
- // moved form the term transformer
- if (sym.owner.isTrait && (sym hasFlag (ACCESSOR | SUPERACCESSOR)))
- sym.makeNotPrivate(sym.owner); //(2)
if (sym.owner.isTrait && (sym hasFlag PROTECTED)) sym setFlag notPROTECTED // 6
if (sym.isClassConstructor && isInner(sym.owner)) { // 1
val p = sym.newValueParameter(sym.pos, "arg" + nme.OUTER)
@@ -154,7 +151,14 @@ abstract class ExplicitOuter extends InfoTransform
if (restp eq restp1) tp else PolyType(tparams, restp1)
case _ =>
- tp
+ // Local fields of traits need to be unconditionally unprivatized.
+ // Reason: Those fields might need to be unprivatized if referenced by an inner class.
+ // On the other hand, mixing in the trait into a separately compiled
+ // class needs to have a common naming scheme, independently of whether
+ // the field was accessed from an inner class or not. See #2946
+ if (sym.owner.isTrait && (sym hasFlag LOCAL))
+ sym.makeNotPrivate(sym.owner)
+ tp
}
/** A base class for transformers that maintain <code>outerParam</code>
diff --git a/test/files/run/t2946/Parsers.scala b/test/files/run/t2946/Parsers.scala
new file mode 100755
index 0000000000..c0961034c4
--- /dev/null
+++ b/test/files/run/t2946/Parsers.scala
@@ -0,0 +1,4 @@
+class Parser {
+ def parse(t: Any): Unit = {
+ }
+}
diff --git a/test/files/run/t2946/ResponseCommon.scala b/test/files/run/t2946/ResponseCommon.scala
new file mode 100755
index 0000000000..fa9d8acccb
--- /dev/null
+++ b/test/files/run/t2946/ResponseCommon.scala
@@ -0,0 +1,14 @@
+trait ResponseCommon extends Parser {
+ private[this] var paramsParser: Parser = null
+ def withParamsParser(parser: Parser) = {paramsParser = parser; this}
+
+ class Foo {
+ println(paramsParser)
+ }
+
+ override abstract def parse(t: Any): Unit = t match {
+ case ("params", value: List[_]) => value.foreach {paramsParser.parse(_)}
+ case _ => super.parse(t)
+ }
+}
+
diff --git a/test/files/run/t2946/Test.scala b/test/files/run/t2946/Test.scala
new file mode 100755
index 0000000000..e9d9896a0e
--- /dev/null
+++ b/test/files/run/t2946/Test.scala
@@ -0,0 +1,7 @@
+class Test extends Parser with ResponseCommon
+
+object Test {
+ def main(args: Array[String]) {
+ new Test
+ }
+}