From 79b81722d8cfe3c2c2fa16bbc8643e8243dfa015 Mon Sep 17 00:00:00 2001 From: Alasdair Armstrong Date: Fri, 21 Jul 2017 17:31:08 +0100 Subject: Add a prove builtin that allows testing flow typing For example: default Order dec val bit[64] -> unit effect pure test64 val cast forall 'n, 'n = 32 | 'n = 64. bit['n] -> unit effect pure test function forall 'n. unit test addr = { _prove(constraint('n != 16)); assert(constraint('n = 64), "64-bit mode"); _prove(constraint('n = 64)); test64(addr); } This doesn't affect the AST at all as _prove is just a ordinary function that the typechecker treats specially. --- src/type_check_new.ml | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/type_check_new.ml b/src/type_check_new.ml index f8845311..f3374fea 100644 --- a/src/type_check_new.ml +++ b/src/type_check_new.ml @@ -1626,6 +1626,10 @@ let rec check_exp env (E_aux (exp_aux, (l, ())) as exp : unit exp) (Typ_aux (typ end | E_app_infix (x, op, y), _ when List.length (Env.get_overloads (deinfix op) env) > 0 -> check_exp env (E_aux (E_app (deinfix op, [x; y]), (l, ()))) typ + | E_app (f, [E_aux (E_constraint nc, _)]), _ when Id.compare f (mk_id "_prove") = 0 -> + if prove env nc + then annot_exp (E_lit (L_aux (L_unit, Parse_ast.Unknown))) unit_typ + else typ_error l ("Cannot prove " ^ string_of_n_constraint nc) | E_app (f, xs), _ when List.length (Env.get_overloads f env) > 0 -> let rec try_overload = function | [] -> typ_error l ("No valid overloading for " ^ string_of_exp exp) -- cgit v1.2.3