@@ -41,7 +41,7 @@ object VarRef {
4141
4242
4343 locally {
44- var x : String | Null = " ???"
44+ var x : String | Null = ???
4545 lazy val y = {
4646 if (x != null ) {
4747 val a : String = x // error: x exists in closure, no longer tackable
@@ -51,7 +51,7 @@ object VarRef {
5151 }
5252
5353 locally {
54- var x : String | Null = " ???"
54+ var x : String | Null = ???
5555 def y = {
5656 if (x != null ) {
5757 val a : String = x // error: x exists in closure, no longer tackable
@@ -61,7 +61,7 @@ object VarRef {
6161 }
6262
6363 lazy val lazyblock = {
64- var x : String | Null = " ???"
64+ var x : String | Null = ???
6565 lazy val y = {
6666 if (x != null ) {
6767 // The enclosingMethods of x definition and x reference hare are same
@@ -70,5 +70,71 @@ object VarRef {
7070 x
7171 }
7272 }
73- }
7473
74+ abstract class F {
75+ def get (): String | Null
76+ }
77+
78+ locally {
79+ var x : String | Null = ???
80+ val y : F = new F {
81+ def get () = {
82+ if (x != null ) x = null
83+ x
84+ }
85+ }
86+ if (x != null ) {
87+ val a : String = x // error: x exists in closure, no longer tackable
88+ }
89+ }
90+
91+ locally {
92+ var x : String | Null = ???
93+ val y : F = new F {
94+ def get () = {
95+ if (x != null ) {
96+ val a : String = x // error: x exists in closure, no longer tackable
97+ }
98+ x
99+ }
100+ }
101+ }
102+
103+ def f (x : => String | Null ): F = new F {
104+ def get () = x
105+ }
106+
107+ locally {
108+ var x : String | Null = ???
109+ val y : F = f {
110+ if (x != null ) {
111+ x = null
112+ }
113+ x
114+ }
115+ if (x != null ) {
116+ val a : String = x // error: x exists in closure, no longer tackable
117+ }
118+ }
119+
120+ // TODO: not working now
121+ // locally {
122+ // var x: String|Null = ???
123+ // val y: F = f {
124+ // if (x != null) {
125+ // val a: String = x // err: x exists in closure, no longer tackable
126+ // }
127+ // x
128+ // }
129+ // }
130+
131+ locally {
132+ var x : String | Null = ???
133+ val y : String => String | Null = s => {
134+ if (x != null ) {
135+ val a : String = x // error: x exists in closure, no longer tackable
136+ }
137+ x
138+ }
139+ }
140+ }
0 commit comments