diff --git a/src/definedness.ml b/src/definedness.ml index 8604c0274cc..725b5cb750c 100644 --- a/src/definedness.ml +++ b/src/definedness.ml @@ -81,7 +81,18 @@ let close (f,d) = (* One traversal for each syntactic category, named by that category *) let rec exp msgs e : f = match e.it with + (* Eager uses are either first-class uses of a variable: *) | VarE i -> M.singleton i.it Eager + (* Or anything that is occurring in a call (as this may call a closure): *) + | CallE (e1, ts, e2) -> eagerify (exps msgs [e1; e2]) + (* And break and return can be thought of as calling a continuation: *) + | BreakE (i, e) -> eagerify (exp msgs e) + | RetE e -> eagerify (exp msgs e) + + (* Uses are delayed by function expressions *) + | FuncE (_, s, tp, p, t, e) -> delayify (exp msgs e /// pat msgs p) + + (* The rest remaining cases just collect the uses of subexpressions: *) | LitE l -> M.empty | PrimE _ -> M.empty | UnE (_, uo, e) -> exp msgs e @@ -97,8 +108,6 @@ let rec exp msgs e : f = match e.it with | AssignE (e1, e2) -> exps msgs [e1; e2] | ArrayE (m, es) -> exps msgs es | IdxE (e1, e2) -> exps msgs [e1; e2] - | FuncE (_, s, tp, p, t, e) -> delayify (exp msgs e /// pat msgs p) - | CallE (e1, ts, e2) -> eagerify (exps msgs [e1; e2]) | BlockE ds -> decs msgs ds | NotE e -> exp msgs e | AndE (e1, e2) -> exps msgs [e1; e2] @@ -110,8 +119,6 @@ let rec exp msgs e : f = match e.it with | LoopE (e1, Some e2) -> exps msgs [e1; e2] | ForE (p, e1, e2) -> exp msgs e1 ++ (exp msgs e2 /// pat msgs p) | LabelE (i, t, e) -> exp msgs e - | BreakE (i, e) -> exp msgs e - | RetE e -> exp msgs e | AsyncE e -> exp msgs e | AwaitE e -> exp msgs e | AssertE e -> exp msgs e diff --git a/test/fail/ok/branch-before-define.run-ir.ok b/test/fail/ok/branch-before-define.run-ir.ok deleted file mode 100644 index ae73b42b320..00000000000 --- a/test/fail/ok/branch-before-define.run-ir.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -branch-before-define.as:3.24-3.25: execution error, accessing identifier before its definition diff --git a/test/fail/ok/branch-before-define.run-low.ok b/test/fail/ok/branch-before-define.run-low.ok deleted file mode 100644 index ae73b42b320..00000000000 --- a/test/fail/ok/branch-before-define.run-low.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -branch-before-define.as:3.24-3.25: execution error, accessing identifier before its definition diff --git a/test/fail/ok/branch-before-define.run.ok b/test/fail/ok/branch-before-define.run.ok deleted file mode 100644 index ae73b42b320..00000000000 --- a/test/fail/ok/branch-before-define.run.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -branch-before-define.as:3.24-3.25: execution error, accessing identifier before its definition diff --git a/test/fail/ok/branch-before-define.tc.ok b/test/fail/ok/branch-before-define.tc.ok new file mode 100644 index 00000000000..a9e4d22abb8 --- /dev/null +++ b/test/fail/ok/branch-before-define.tc.ok @@ -0,0 +1 @@ +branch-before-define.as:4.7-4.40: definedness error, cannot use g before x has been defined diff --git a/test/fail/ok/branch-before-define.wasm-run.ok b/test/fail/ok/branch-before-define.wasm-run.ok deleted file mode 100644 index c755631f4da..00000000000 --- a/test/fail/ok/branch-before-define.wasm-run.ok +++ /dev/null @@ -1 +0,0 @@ -_out/branch-before-define.wasm:0x___: runtime trap: unreachable executed diff --git a/test/fail/ok/return-before-define.run-ir.ok b/test/fail/ok/return-before-define.run-ir.ok deleted file mode 100644 index ebeee2de382..00000000000 --- a/test/fail/ok/return-before-define.run-ir.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -return-before-define.as:2.22-2.23: execution error, accessing identifier before its definition diff --git a/test/fail/ok/return-before-define.run-low.ok b/test/fail/ok/return-before-define.run-low.ok deleted file mode 100644 index ebeee2de382..00000000000 --- a/test/fail/ok/return-before-define.run-low.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -return-before-define.as:2.22-2.23: execution error, accessing identifier before its definition diff --git a/test/fail/ok/return-before-define.run.ok b/test/fail/ok/return-before-define.run.ok deleted file mode 100644 index ebeee2de382..00000000000 --- a/test/fail/ok/return-before-define.run.ok +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -return-before-define.as:2.22-2.23: execution error, accessing identifier before its definition diff --git a/test/fail/ok/return-before-define.tc.ok b/test/fail/ok/return-before-define.tc.ok new file mode 100644 index 00000000000..8163fadae2c --- /dev/null +++ b/test/fail/ok/return-before-define.tc.ok @@ -0,0 +1 @@ +return-before-define.as:3.5-3.34: definedness error, cannot use g before x has been defined diff --git a/test/fail/ok/return-before-define.wasm-run.ok b/test/fail/ok/return-before-define.wasm-run.ok deleted file mode 100644 index 790d3f8183b..00000000000 --- a/test/fail/ok/return-before-define.wasm-run.ok +++ /dev/null @@ -1 +0,0 @@ -_out/return-before-define.wasm:0x___: runtime trap: unreachable executed