Skip to content

Commit 255b9cc

Browse files
committed
Handle local classes properly
1 parent 3dcebc3 commit 255b9cc

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

compiler/src/dotty/tools/dotc/transform/init/Summarization.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,15 @@ object Summarization {
8686
val cls = tref.classSymbol.asClass
8787
// local class may capture, thus we need to track it
8888
if (tref.prefix == NoPrefix) {
89+
val cur = theCtx.owner.lexicallyEnclosingClass.asClass
8990
val thisRef = ThisRef()(expr)
90-
Summary.empty + Warm(cls, thisRef)(expr)
91+
val enclosing = cls.owner.lexicallyEnclosingClass.asClass
92+
val (pots, effs) = resolveThis(enclosing, thisRef, cur, expr)
93+
if pots.isEmpty then (Potentials.empty, effs)
94+
else {
95+
assert(pots.size == 1)
96+
(Warm(cls, pots.head)(expr).toPots, effs)
97+
}
9198
}
9299
else {
93100
val (pots, effs) = analyze(tref.prefix, expr)
@@ -323,7 +330,7 @@ object Summarization {
323330
if (tref.prefix != NoPrefix)
324331
parentCls -> analyze(tref.prefix, source)(env.withOwner(cls))._1
325332
else
326-
parentCls -> analyze(cls.enclosingClass.thisType, source)(env.withOwner(cls))._1
333+
parentCls -> analyze(cls.owner.lexicallyEnclosingClass.thisType, source)(env.withOwner(cls))._1
327334
}
328335

329336
if (cls.defTree.isEmpty)

tests/init/neg/local-class.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Outer {
2+
def foo = {
3+
class C {
4+
val x = n
5+
}
6+
class D {
7+
new C
8+
}
9+
10+
new D
11+
}
12+
13+
foo
14+
15+
val n = 10 // error
16+
}

tests/init/pos/explicitOuter.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Outer(elem: Int, val next: Outer) {
2+
def inner2 = {
3+
class C {
4+
val x = elem
5+
}
6+
class D {
7+
new C
8+
}
9+
}
10+
}

0 commit comments

Comments
 (0)