diff options
-rw-r--r-- | src/dotty/tools/dotc/transform/Constructors.scala | 5 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/ExplicitOuter.scala | 4 | ||||
-rw-r--r-- | tests/pos/i503.scala | 13 | ||||
-rw-r--r-- | tests/pos/superacc.scala | 17 |
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 + } +} |