File tree Expand file tree Collapse file tree 10 files changed +504
-244
lines changed 
compiler/src/dotty/tools/dotc/transform/init Expand file tree Collapse file tree 10 files changed +504
-244
lines changed   Load Diff Large diffs are not rendered by default. 
Original file line number Diff line number Diff line change 1- class  Outer  {
2-   val  f  =  5 
3-   class  Inner  extends  Outer  {
4-     val  g  =  Outer .this .f
1+ class  Outer (val  f :  Int ) {
2+   class  Inner  extends  Outer (5 ) {
3+     def  g ():  Int  =  this .f
54  }
65}
76
87object  O  {
98  def  foo (i : Outer ):  Unit  = 
109    val  i2  =  new  i.Inner  //  i2.outer should always be OfClass(Outer)
11-     foo(i2 )
10+     println( " i2.g =  "   +  i2.g() )
1211
13-   foo(new  Outer )
12+   foo(new  Outer ( 6 ) )
1413}
Original file line number Diff line number Diff line change @@ -11,15 +11,20 @@ class A(val x: Int) {
1111    }
1212  }
1313}
14- class  AA (x : Int ) extends  A (x) {
14+ class  AA (y : Int ) extends  A (y+ 1 ) {
15+   class  E  {}
1516  def  foo  =  {
1617    val  a  =  if  true  then  new  A (42 ) else  new  AA (46 )
1718    println(" a = "   +  a.hashCode())
1819    class  C  /* outer: AA(44) (`Main.aa`)*/   extends  a.B  /* outer: A(42) or AA(46) (`a`)*/   {
1920      println(" AA.this = "   +  AA .this .hashCode()) //  Main.aa
2021      println(" AA.this.x = "   +  x) //  C --> outer AA --> parent A (44)
2122      override  def  fooz2  =  x //  44
23+       val  z  =  fooz //  (A.this.x)
24+       println(" z = "   +  z)
25+ 
2226    }
27+     class  B  extends  AA .this .E  {}
2328    val  c :  C  =  new  C 
2429    println(" c = "   +  c.hashCode())
2530    val  d  =  new  c.D  //  outer: C (`c`)
Original file line number Diff line number Diff line change 1+ class  A  {
2+   val  field_a  =  5 
3+   def  bar ():  Int  =  A .this .field_a
4+ }
5+ 
6+ class  B  extends  A  {
7+   val  field_b  =  field_a
8+   class  C  {
9+     def  bar2 () =  B .this .field_b
10+     val  field_c  =  bar() //  expands to B.this.bar()
11+     val  field_c2  =  field_a //  C --> outer B --> parent A
12+   }
13+ }
14+ 
15+ object  O : 
16+   val  b  =  new  B 
17+   class  D  extends  b.C  { //  D --> parent C --> outer B
18+     val  field_d  =  bar2()
19+   }
20+   val  d  =  new  D 
Original file line number Diff line number Diff line change 88  |       │                ^
99  |       ├── object B {	[ global-cycle6.scala:8 ]
1010  |       │   ^
11-   |       └── val a = new A.Inner	[ global-cycle6.scala:9 ]
12-   |                   ^^^^^^^^^^^
11+   |       ├── val a = new A.Inner	[ global-cycle6.scala:9 ]
12+   |       │           ^^^^^^^^^^^
13+   |       ├── class Inner {	[ global-cycle6.scala:3 ]
14+   |       │   ^
15+   |       └── println(n) // warn	[ global-cycle6.scala:4 ]
16+   |                   ^
1317-- Warning: tests/init-global/warn/global-cycle6.scala:4:12 ------------------------------------------------------------
14184 |    println(n) // warn
1519  |            ^
2226  |            │   ^
2327  |            └── println(n) // warn	[ global-cycle6.scala:4 ]
2428  |                        ^
25- -- Warning: tests/init-global/warn/global-cycle6.scala:14:9 ------------------------------------------------------------
26- 14 |  object A { // warn
27-    |         ^
28-    |         Cyclic initialization: object A -> object B -> object A. Calling trace:
29-    |         ├── object A { // warn	[ global-cycle6.scala:14 ]
30-    |         │   ^
31-    |         ├── val n: Int = B.m	[ global-cycle6.scala:15 ]
32-    |         │                ^
33-    |         ├── object B {	[ global-cycle6.scala:21 ]
34-    |         │   ^
35-    |         └── val a = new A.Inner	[ global-cycle6.scala:22 ]
36-    |                     ^^^^^^^^^^^
Original file line number Diff line number Diff line change @@ -11,7 +11,7 @@ object B {
1111}
1212
1313object  O  {
14-   object  A  {  //  warn 
14+   object  A  {
1515    val  n :  Int  =  B .m
1616    class  Inner  {
1717      val  x :  Int  =  4 
Original file line number Diff line number Diff line change 1+ -- Warning: tests/init-global/warn/inner-extends-outer.scala:22:19 -----------------------------------------------------
2+ 22 |  def bar(): Int = f2 // warn
3+    |                   ^^
4+    |                   Access uninitialized field value f2. Calling trace:
5+    |                   ├── object O extends T {	[ inner-extends-outer.scala:15 ]
6+    |                   │   ^
7+    |                   ├── val f1 = foo(new Outer(this))	[ inner-extends-outer.scala:20 ]
8+    |                   │            ^^^^^^^^^^^^^^^^^^^^
9+    |                   ├── def foo(i: Outer): Int =	[ inner-extends-outer.scala:16 ]
10+    |                   │   ^
11+    |                   ├── i2.g()	[ inner-extends-outer.scala:18 ]
12+    |                   │   ^^^^^^
13+    |                   ├── def g(): Int = Outer.this.t.bar()	[ inner-extends-outer.scala:11 ]
14+    |                   │                  ^^^^^^^^^^^^^^^^^^
15+    |                   └── def bar(): Int = f2 // warn	[ inner-extends-outer.scala:22 ]
16+    |                                        ^^
Original file line number Diff line number Diff line change 1+ trait  T  {
2+   def  bar ():  Int 
3+ }
4+ 
5+ class  C  extends  T  {
6+   def  bar ():  Int  =  5 
7+ }
8+ 
9+ class  Outer (val  t :  T ) {
10+   class  Inner  extends  Outer (new  C ) {
11+     def  g ():  Int  =  Outer .this .t.bar()
12+   }
13+ }
14+ 
15+ object  O  extends  T  {
16+   def  foo (i : Outer ):  Int  = 
17+     val  i2  =  new  i.Inner  //  i2.outer should always be OfClass(Outer)
18+     i2.g()
19+ 
20+   val  f1  =  foo(new  Outer (this ))
21+   val  f2  =  5 
22+   def  bar ():  Int  =  f2 //  warn
23+ }
Original file line number Diff line number Diff line change 1+ -- Warning: tests/init-global/warn/resolve-outer-of-parent.scala:7:16 --------------------------------------------------
2+ 7 |  def foo() = O.d // warn
3+   |              ^^^
4+   |              Access uninitialized field value d. Calling trace:
5+   |              ├── object O:	[ resolve-outer-of-parent.scala:14 ]
6+   |              │   ^
7+   |              ├── val d = new D	[ resolve-outer-of-parent.scala:19 ]
8+   |              │           ^^^^^
9+   |              ├── class D extends b.C { // D --> parent C --> outer B	[ resolve-outer-of-parent.scala:16 ]
10+   |              │   ^
11+   |              ├── val field_d = bar2()	[ resolve-outer-of-parent.scala:17 ]
12+   |              │                 ^^^^^^
13+   |              ├── def bar2() = B.this.foo()	[ resolve-outer-of-parent.scala:9 ]
14+   |              │                ^^^^^^^^^^^^
15+   |              └── def foo() = O.d // warn	[ resolve-outer-of-parent.scala:7 ]
16+   |                              ^^^
Original file line number Diff line number Diff line change 1+ class  A  {
2+   val  field_a  =  5 
3+   def  bar ():  Int  =  A .this .field_a
4+ }
5+ 
6+ class  B  extends  A  {
7+   def  foo () =  O .d //  warn
8+   class  C  {
9+     def  bar2 () =  B .this .foo()
10+     val  field_c  =  bar() //  expands to B.this.bar()
11+   }
12+ }
13+ 
14+ object  O : 
15+   val  b  =  new  B 
16+   class  D  extends  b.C  { //  D --> parent C --> outer B
17+     val  field_d  =  bar2()
18+   }
19+   val  d  =  new  D 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments