Skip to content

Commit 6408889

Browse files
mboveldwijnandnoti0na1odersky
committed
Use isStatic intsead of isStaticOwner in hasLocalInstantiation
Co-Authored-By: Dale Wijnand <[email protected]> Co-Authored-By: noti0na1 <[email protected]> Co-Authored-By: odersky <[email protected]>
1 parent 9715eed commit 6408889

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

Diff for: compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ object ExplicitOuter {
227227
private def hasLocalInstantiation(cls: ClassSymbol)(using Context): Boolean =
228228
// Modules are normally locally instantiated, except if they are declared in a trait,
229229
// in which case they will be instantiated in the classes that mix in the trait.
230-
cls.owner.ownersIterator.takeWhile(!_.isStatic).exists(_.isTerm)
230+
cls.owner.ownersIterator.takeWhile(!_.isStaticOwner).exists(_.isTerm)
231231
|| cls.is(Private, butNot = Module)
232232
|| cls.is(Module) && !cls.owner.is(Trait)
233233

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
List(public T1$C1())
2+
List(public T2$$anon$1$C2())
3+
List(public T3$C3$1())
4+
List(public T4$$anon$2$C4())
5+
List(public T5$C5(T5))
6+
List(public T6$$anon$3$C6())
7+
List(public T7$C7$1())
8+
List(public T8$$anon$4$C8())
9+
List(public T9$C9(T9))
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// This test checks that references to outer classes in inner classes are
2+
// eliminated in some cases when they are not used. This is done is the
3+
// ExplicitOuter phase. See issue #19569 for discussions.
4+
5+
object helper {
6+
def test(cls: Class[?]) = println(cls.getDeclaredConstructors.toList)
7+
}
8+
9+
import helper.test
10+
11+
object T1 { class C1; test(classOf[C1]) }
12+
object T2 { new AnyRef { class C2; test(classOf[C2]) } }
13+
object T3 { def t3(): Unit = { class C3; test(classOf[C3]) } }
14+
object T4 { def t4(): Unit = new AnyRef { class C4; test(classOf[C4]) } }
15+
16+
class T5 { class C5; test(classOf[C5]) } // outer ref currently not elided
17+
class T6 { new AnyRef { class C6; test(classOf[C6]) } }
18+
class T7 { def t7(): Unit = { class C7; test(classOf[C7]) } }
19+
class T8 { def t8(): Unit = new AnyRef { class C8; test(classOf[C8]) } }
20+
21+
// The outer ref is not elided when it is used:
22+
class T9 { var x = 451; class C9 {def getX = x}; test(classOf[C9]) }
23+
24+
object Test {
25+
def main(args: Array[String]): Unit = {
26+
T1
27+
T2
28+
T3.t3()
29+
T4.t4()
30+
new T5()
31+
new T6()
32+
new T7().t7()
33+
new T8().t8()
34+
new T9()
35+
}
36+
}

0 commit comments

Comments
 (0)