aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/transform/Constructors.scala5
-rw-r--r--src/dotty/tools/dotc/transform/ExplicitOuter.scala4
-rw-r--r--tests/pos/i503.scala13
-rw-r--r--tests/pos/superacc.scala17
4 files changed, 35 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/transform/Constructors.scala b/src/dotty/tools/dotc/transform/Constructors.scala
index 6fb67cd22..8aae3af5b 100644
--- a/src/dotty/tools/dotc/transform/Constructors.scala
+++ b/src/dotty/tools/dotc/transform/Constructors.scala
@@ -37,7 +37,7 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
*/
override def transformSym(sym: SymDenotation)(implicit ctx: Context): SymDenotation = {
def ownerBecomesConstructor(owner: Symbol): Boolean =
- (owner.isLocalDummy || owner.isTerm && !owner.is(Method | Lazy)) &&
+ (owner.isLocalDummy || owner.isTerm && !owner.is(MethodOrLazy)) &&
owner.owner.isClass
if (ownerBecomesConstructor(sym.owner))
sym.copySymDenotation(owner = sym.owner.enclosingClass.primaryConstructor)
@@ -54,9 +54,8 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
* constructor.
*/
private def mightBeDropped(sym: Symbol)(implicit ctx: Context) =
- sym.is(Private, butNot = KeeperFlags) && !sym.is(MutableParamAccessor)
+ sym.is(Private, butNot = MethodOrLazy) && !sym.is(MutableParamAccessor)
- private final val KeeperFlags = Method | Lazy
private final val MutableParamAccessor = allOf(Mutable, ParamAccessor)
override def transformTemplate(tree: Template)(implicit ctx: Context, info: TransformerInfo): Tree = {
diff --git a/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/src/dotty/tools/dotc/transform/ExplicitOuter.scala
index 20e367e1f..09f0d695d 100644
--- a/src/dotty/tools/dotc/transform/ExplicitOuter.scala
+++ b/src/dotty/tools/dotc/transform/ExplicitOuter.scala
@@ -213,7 +213,7 @@ object ExplicitOuter {
case id: Ident =>
id.tpe match {
case ref @ TermRef(NoPrefix, _) =>
- ref.symbol.is(Method) && isOuter(id.symbol.owner.enclosingClass)
+ ref.symbol.is(Hoistable) && isOuter(id.symbol.owner.enclosingClass)
// methods will be placed in enclosing class scope by LambdaLift, so they will get
// an outer path then.
case _ => false
@@ -225,6 +225,8 @@ object ExplicitOuter {
}
}
+ private final val Hoistable = Method | Lazy | Module
+
/** The outer prefix implied by type `tpe` */
private def outerPrefix(tpe: Type)(implicit ctx: Context): Type = tpe match {
case tpe: TypeRef =>
diff --git a/tests/pos/i503.scala b/tests/pos/i503.scala
new file mode 100644
index 000000000..fd25dc979
--- /dev/null
+++ b/tests/pos/i503.scala
@@ -0,0 +1,13 @@
+class HelloWorld {
+ def main(args: Array[String]): Unit = {
+ object TypeBool;
+
+ class Fct {
+ def g(x : Int) = TypeBool
+ }
+
+ trait Fct2 {
+ def g(x : Int) = TypeBool
+ }
+ }
+}
diff --git a/tests/pos/superacc.scala b/tests/pos/superacc.scala
new file mode 100644
index 000000000..91397003d
--- /dev/null
+++ b/tests/pos/superacc.scala
@@ -0,0 +1,17 @@
+// scenario one: supercalls in traits
+abstract class C {
+ def foo: Int = 2
+ def baz: Int = 2
+}
+
+trait T extends C {
+ override def foo = super.foo + 1
+}
+
+
+// scenario 2: supercalls in nested classes
+class D extends C with T {
+ class I {
+ val x= D.super.baz
+ }
+}