Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 4 additions & 12 deletions src/definedness.ml
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,6 @@ let eager_vars : f -> S.t =
let delayed_vars : f -> S.t =
fun f -> S.of_list (M.keys (M.filter (fun _ u -> u = Delayed) f))

(* This closes a combined set over itself (recursion or mutual recursion) *)
let close (f,d) =
if S.is_empty (S.inter d (eager_vars f))
then diff f d
else eagerify (diff f d)

(* One traversal for each syntactic category, named by that category *)

let rec exp msgs e : f = match e.it with
Expand All @@ -103,7 +97,7 @@ let rec exp msgs e : f = match e.it with
| ObjE (s, efs) ->
(* For actors, this may be too permissive; to be revised when we work on actors again *)
(* Also see https://dfinity.atlassian.net/browse/AST-49 *)
close (exp_fields msgs efs)
exp_fields msgs efs
| DotE (e, i) -> exp msgs e
| AssignE (e1, e2) -> exps msgs [e1; e2]
| ArrayE (m, es) -> exps msgs es
Expand Down Expand Up @@ -144,18 +138,16 @@ and case msgs (c : case) = exp msgs c.it.exp /// pat msgs c.it.pat

and cases msgs cs : f = unions (case msgs) cs

and exp_field msgs (ef : exp_field) : fd
= dec msgs ef.it.dec

and exp_fields msgs efs : fd = union_binders (exp_field msgs) efs
and exp_fields msgs efs : f =
decs msgs (List.map (fun ef -> ef.it.dec) efs)

and dec msgs d = match d.it with
| ExpD e -> (exp msgs e, S.empty)
| LetD (p, e) -> pat msgs p +++ exp msgs e
| VarD (i, e) -> (M.empty, S.singleton i.it) +++ exp msgs e
| TypD (i, tp, t) -> (M.empty, S.empty)
| ClassD (i, tp, s, p, i', efs) ->
(M.empty, S.singleton i.it) +++ delayify (close (exp_fields msgs efs) /// pat msgs p // i'.it)
(M.empty, S.singleton i.it) +++ delayify (exp_fields msgs efs /// pat msgs p // i'.it)

and decs msgs decs : f =
(* Annotate the declarations with the analysis results *)
Expand Down
1 change: 1 addition & 0 deletions test/fail/ok/use-before-define6.tc.ok
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use-before-define6.as:9.3-9.22: definedness error, cannot use g before g has been defined
15 changes: 15 additions & 0 deletions test/fail/use-before-define6.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@


class Bar () {

private class Foo(f1:Int -> Int, f2:Int -> Int) {
private bomb = f1(666) + f2(666);
};

var Bar = Foo(g, g);

private g(n:Int) : Int = n + 1;

};

let _ = Bar();