From f8cdefcba5537b5dc210c3a0b21bc5b32d8a3ef9 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 14 Nov 2019 17:41:31 +0100 Subject: [PATCH] Emit an error on not implemented closure --- src/compiler.ts | 9 +++++++++ tests/compiler/closure.json | 4 ++++ tests/compiler/closure.optimized.wat | 8 -------- tests/compiler/closure.ts | 22 +++++++--------------- 4 files changed, 20 insertions(+), 23 deletions(-) delete mode 100644 tests/compiler/closure.optimized.wat diff --git a/src/compiler.ts b/src/compiler.ts index 54908fde6c..161bd21b8f 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -7251,6 +7251,15 @@ export class Compiler extends DiagnosticEmitter { switch (target.kind) { case ElementKind.LOCAL: { let type = (target).type; + if (target.parent != flow.parentFunction) { + // Closures are not yet supported + this.error( + DiagnosticCode.Not_implemented, + expression.range + ); + this.currentType = type; + return module.unreachable(); + } assert(type != Type.void); if ((target).is(CommonFlags.INLINED)) { return this.compileInlineConstant(target, contextualType, constraints); diff --git a/tests/compiler/closure.json b/tests/compiler/closure.json index b1da366ff4..5f6d7ed637 100644 --- a/tests/compiler/closure.json +++ b/tests/compiler/closure.json @@ -1,5 +1,9 @@ { "asc_flags": [ "--runtime none" + ], + "stderr": [ + "AS100: Not implemented.", + "EOF" ] } \ No newline at end of file diff --git a/tests/compiler/closure.optimized.wat b/tests/compiler/closure.optimized.wat deleted file mode 100644 index bb456a1172..0000000000 --- a/tests/compiler/closure.optimized.wat +++ /dev/null @@ -1,8 +0,0 @@ -(module - (type $FUNCSIG$v (func)) - (memory $0 0) - (export "memory" (memory $0)) - (func $null (; 0 ;) (type $FUNCSIG$v) - nop - ) -) diff --git a/tests/compiler/closure.ts b/tests/compiler/closure.ts index f1995598d2..e5fee482f5 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -1,16 +1,8 @@ -// TODO +function test($local0: i32, $local1: i32): (value: i32) => i32 { + return function inner(value: i32) { + return $local1; // closure + }; +} -// export function outer(): () => () => i32 { -// var inner: i32 = 42; // should become a global right away -// return function a(): () => i32 { -// return function b(): i32 { -// return inner++; -// }; -// }; -// } - -// var fnA = outer(); -// var fnB = fnA(); - -// assert(fnB() == 42); -// assert(fnB() == 43); +test(1, 2); +ERROR("EOF");