Skip to content

Commit 7296e72

Browse files
committed
Skip superArg methods when determining whether an outer accessor is needed
1 parent d1255f3 commit 7296e72

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import core.Decorators._
1313
import core.StdNames.nme
1414
import core.Names._
1515
import core.NameOps._
16+
import core.NameKinds.SuperArgName
1617
import SymUtils._
1718
import dotty.tools.dotc.ast.tpd
1819

@@ -197,10 +198,16 @@ object ExplicitOuter {
197198
private def outerAccName(cls: ClassSymbol)(using Context): TermName =
198199
nme.OUTER.expandedName(cls)
199200

201+
private def outerOwner(sym: Symbol)(using Context): Symbol =
202+
val owner = sym.effectiveOwner
203+
if owner.name.is(SuperArgName) || owner.isLocalDummy
204+
then owner.enclosingClass
205+
else owner
206+
200207
/** Class needs an outer pointer, provided there is a reference to an outer this in it. */
201208
def needsOuterIfReferenced(cls: ClassSymbol)(using Context): Boolean =
202209
!(cls.isStatic
203-
|| cls.effectiveOwner.isStaticOwner
210+
|| outerOwner(cls).isStaticOwner
204211
|| cls.is(PureInterface)
205212
)
206213

tests/pos/t0049.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
class C1(x: AnyRef) {};
22

33
class C2 extends C1({ class A extends AnyRef {}; (new A) : AnyRef }) {};
4+
5+
class Outer:
6+
class C2 extends C1({ class A extends AnyRef {}; (new A) : AnyRef }) {};

0 commit comments

Comments
 (0)