diff --git a/src/await.ml b/src/await.ml index bd5e9e759f8..b35c5014fc4 100644 --- a/src/await.ml +++ b/src/await.ml @@ -418,12 +418,19 @@ and c_exp' context exp k = | NewObjE _ -> exp and c_block context decs exp k = - declare_decs decs (c_decs context decs (meta T.unit (fun _ -> c_exp context exp k))) + let is_typ dec = + match dec.it with + | TypD _ -> true + | _ -> false + in + let (typ_decs,val_decs) = List.partition is_typ decs in + blockE typ_decs + (declare_decs val_decs (c_decs context val_decs (meta T.unit (fun _ -> c_exp context exp k)))) and c_dec context dec (k:kont) = match dec.it with | TypD _ -> - k -@- unitE + assert false | LetD (pat,exp) -> let patenv,pat' = rename_pat pat in let block exp = @@ -462,7 +469,7 @@ and c_decs context decs k = and declare_dec dec exp : exp = match dec.it with - | TypD _ -> exp + | TypD _ -> assert false | LetD (pat, _) -> declare_pat pat exp | VarD (id, exp1) -> declare_id id (T.Mut (typ exp1)) exp diff --git a/src/construct.ml b/src/construct.ml index df6d17f9901..567dc8a18b9 100644 --- a/src/construct.ml +++ b/src/construct.ml @@ -100,6 +100,9 @@ let dec_eff dec = match dec.it with | LetD (_,e) | VarD (_,e) -> eff e let blockE decs exp = + match decs with + | [] -> exp + | _ -> let es = List.map dec_eff decs in let typ = typ exp in let e = List.fold_left max_eff (eff exp) es in diff --git a/test/run-dfinity/AST-66.as b/test/run-dfinity/AST-66.as new file mode 100644 index 00000000000..f54ae2fb10e --- /dev/null +++ b/test/run-dfinity/AST-66.as @@ -0,0 +1,13 @@ +// test cps conversion of async blocks with type decs + +let _ = async{ + type T = Null; + await { async (null:T) }; +}; + +let _ = async{ + type T = U; + let _ = await { async (null:T) }; + type U = Null; + await { async (null:T) }; +}; diff --git a/test/run-dfinity/ok/AST-66.dvm-run.ok b/test/run-dfinity/ok/AST-66.dvm-run.ok new file mode 100644 index 00000000000..3b7e66c4381 --- /dev/null +++ b/test/run-dfinity/ok/AST-66.dvm-run.ok @@ -0,0 +1 @@ +Top-level code done.