Skip to content

Commit 783240f

Browse files
committed
Tc: fix context push/pop in #check
Use the proper API to reset the id_info_table, or this will crash in IDE mode. Also descend into the terms in VisitM.
1 parent 4e39dc0 commit 783240f

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

src/syntax/FStarC.Syntax.VisitM.fst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,10 @@ let rec on_sub_sigelt' #m {|d : lvm m |} (se : sigelt') : m sigelt' =
437437
// ^ review: residual flags should not have terms
438438
return <| Sig_effect_abbrev {lid; us; bs; comp; cflags}
439439

440-
(* No content *)
440+
(* No content, except for Check. *)
441+
| Sig_pragma (Check t) ->
442+
let! t = f_term t in
443+
return <| Sig_pragma (Check t)
441444
| Sig_pragma _ -> return se
442445

443446
| Sig_polymonadic_bind {m_lid; n_lid; p_lid; tm; typ; kind} ->

src/typechecker/FStarC.TypeChecker.Tc.fst

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,16 @@ let tc_decl' env0 se: list sigelt & list sigelt & Env.env =
920920
[se], [], env0)
921921

922922

923+
let snapshot_context env msg = BU.atomically (fun () ->
924+
TypeChecker.Env.snapshot env msg)
925+
926+
let rollback_context solver msg depth : env = BU.atomically (fun () ->
927+
let env = TypeChecker.Env.rollback solver msg depth in
928+
env)
929+
930+
let push_context env msg = snd (snapshot_context env msg)
931+
let pop_context env msg = rollback_context env.solver msg None
932+
923933
(* [tc_decl env se] typechecks [se] in environment [env] and returns
924934
* the list of typechecked sig_elts, and a list of new sig_elts elaborated
925935
* during typechecking but not yet typechecked. This may also be called
@@ -1013,6 +1023,7 @@ let add_sigelt_to_env (env:Env.env) (se:sigelt) (from_cache:bool) : Env.env =
10131023
env
10141024

10151025
| Sig_pragma (Check t0) ->
1026+
let env = push_context env "#check" in
10161027
let tx = UF.new_transaction () in
10171028
let t, lc, g = tc_term { env with instantiate_imp = false } t0 in
10181029
let c, g' = lcomp_comp lc in
@@ -1028,7 +1039,7 @@ let add_sigelt_to_env (env:Env.env) (se:sigelt) (from_cache:bool) : Env.env =
10281039
empty
10291040
]
10301041
);
1031-
UF.rollback tx;
1042+
let env = pop_context env "#check" in
10321043
env
10331044

10341045
| Sig_new_effect ne ->
@@ -1176,16 +1187,6 @@ let tc_decls env ses =
11761187
let _ =
11771188
tc_decls_knot := Some tc_decls
11781189

1179-
let snapshot_context env msg = BU.atomically (fun () ->
1180-
TypeChecker.Env.snapshot env msg)
1181-
1182-
let rollback_context solver msg depth : env = BU.atomically (fun () ->
1183-
let env = TypeChecker.Env.rollback solver msg depth in
1184-
env)
1185-
1186-
let push_context env msg = snd (snapshot_context env msg)
1187-
let pop_context env msg = rollback_context env.solver msg None
1188-
11891190
let tc_partial_modul env modul =
11901191
let verify = Options.should_verify (string_of_lid modul.name) in
11911192
let action = if verify then "verifying" else "lax-checking" in

0 commit comments

Comments
 (0)