File tree Expand file tree Collapse file tree 4 files changed +28
-6
lines changed Expand file tree Collapse file tree 4 files changed +28
-6
lines changed Original file line number Diff line number Diff line change @@ -5596,13 +5596,21 @@ export class Compiler extends DiagnosticEmitter {
55965596 // to compile just the value, we need to know the target's type
55975597 let targetType : Type ;
55985598 switch ( target . kind ) {
5599- case ElementKind . Global : {
5600- if ( ! this . compileGlobalLazy ( < Global > target , expression ) ) {
5599+ case ElementKind . Global :
5600+ case ElementKind . Local : {
5601+ if ( target . kind == ElementKind . Global ) {
5602+ if ( ! this . compileGlobalLazy ( < Global > target , expression ) ) {
5603+ return this . module . unreachable ( ) ;
5604+ }
5605+ } else if ( ! ( < Local > target ) . declaredByFlow ( flow ) ) {
5606+ // TODO: closures
5607+ this . error (
5608+ DiagnosticCode . Not_implemented_0 ,
5609+ expression . range ,
5610+ "Closures"
5611+ ) ;
56015612 return this . module . unreachable ( ) ;
56025613 }
5603- // fall-through
5604- }
5605- case ElementKind . Local : {
56065614 if ( this . pendingElements . has ( target ) ) {
56075615 this . error (
56085616 DiagnosticCode . Variable_0_used_before_its_declaration ,
@@ -7371,7 +7379,7 @@ export class Compiler extends DiagnosticEmitter {
73717379 this . currentType = localType ;
73727380 }
73737381
7374- if ( target . parent != flow . targetFunction ) {
7382+ if ( ! local . declaredByFlow ( flow ) ) {
73757383 // TODO: closures
73767384 this . error (
73777385 DiagnosticCode . Not_implemented_0 ,
Original file line number Diff line number Diff line change @@ -3639,6 +3639,10 @@ export class Local extends VariableLikeElement {
36393639 assert ( type != Type . void ) ;
36403640 this . setType ( type ) ;
36413641 }
3642+
3643+ declaredByFlow ( flow : Flow ) : bool {
3644+ return this . parent == flow . targetFunction ;
3645+ }
36423646}
36433647
36443648/** A yet unresolved function prototype. */
Original file line number Diff line number Diff line change 1010 " $local0; // closure 3" ,
1111 " AS100: Not implemented: Closures" ,
1212 " $local0(123); // closure 4" ,
13+ " AS100: Not implemented: Closures" ,
14+ " $local0 = 10; // closure 5" ,
1315 " EOF"
1416 ]
1517}
Original file line number Diff line number Diff line change @@ -28,4 +28,12 @@ function testFuncParam($local0: (x: i32) => void): () => void {
2828}
2929testFuncParam ( ( x : i32 ) => { } ) ;
3030
31+ function testAssign ( ) : ( value : i32 ) => void {
32+ let $local0 = 0 ;
33+ return function inner ( value : i32 ) : void {
34+ $local0 = 10 ; // closure 5
35+ } ;
36+ }
37+ testAssign ( ) ;
38+
3139ERROR ( "EOF" ) ;
You can’t perform that action at this time.
0 commit comments