Skip to content

Commit 423ca92

Browse files
authored
Merge pull request #3720 from mtzguido/errs
Some fixes in support of Pulse errors
2 parents 9b23ef3 + 8324b69 commit 423ca92

File tree

6 files changed

+36
-30
lines changed

6 files changed

+36
-30
lines changed

src/tactics/FStarC.Tactics.V2.Basic.fst

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2635,36 +2635,34 @@ let refl_check_prop_validity (g:env) (e:term) : tac (option unit & issues) =
26352635
else return (None, [unexpected_uvars_issue (Env.get_range g)])
26362636

26372637
let refl_check_match_complete (g:env) (sc:term) (scty:typ) (pats : list RD.pattern)
2638-
: tac (option (list RD.pattern & list (list RD.binding)))
2638+
: tac (option (list RD.pattern & list (list RD.binding)) & issues)
26392639
=
2640-
return () ;!
2640+
refl_typing_builtin_wrapper "refl_check_match_complete" fun _ ->
26412641
(* We just craft a match with the sc and patterns, using `1` in every
26422642
branch, and check it against type int. *)
26432643
let one = U.exp_int "1" in
26442644
let brs = List.map (fun p -> let p = pack_pat p in (p, None, one)) pats in
26452645
let mm = mk (Tm_match {scrutinee=sc; ret_opt=None; brs=brs; rc_opt=None}) sc.pos in
26462646
let env = g in
26472647
let env = Env.set_expected_typ env S.t_int in
2648-
let! mm, _, g = __tc env mm in
2649-
2650-
let errs, b = Errors.catch_errors_and_ignore_rest (fun () -> Env.is_trivial <| Rel.discharge_guard env g) in
2651-
match errs, b with
2652-
| [], Some true ->
2653-
let get_pats t =
2654-
match (U.unmeta t).n with
2655-
| Tm_match {brs} -> List.map (fun (p,_,_) -> p) brs
2656-
| _ -> failwith "refl_check_match_complete: not a match?"
2657-
in
2658-
let pats = get_pats mm in
2659-
let rec bnds_for_pat (p:pat) : list RD.binding =
2660-
match p.v with
2661-
| Pat_constant _ -> []
2662-
| Pat_cons (fv, _, pats) -> List.concatMap (fun (p, _) -> bnds_for_pat p) pats
2663-
| Pat_var bv -> [bv_to_binding bv]
2664-
| Pat_dot_term _ -> []
2665-
in
2666-
return (Some (List.map inspect_pat pats, List.map bnds_for_pat pats))
2667-
| _ -> return None
2648+
let mm, _, guard = TcTerm.typeof_tot_or_gtot_term env mm true in
2649+
2650+
Rel.force_trivial_guard env guard;
2651+
let get_pats t =
2652+
match (U.unmeta t).n with
2653+
| Tm_match {brs} -> List.map (fun (p,_,_) -> p) brs
2654+
| _ -> failwith "refl_check_match_complete: not a match?"
2655+
in
2656+
let mm = SC.deep_compress false true mm in // important! we must return fully-compressed patterns
2657+
let pats = get_pats mm in
2658+
let rec bnds_for_pat (p:pat) : list RD.binding =
2659+
match p.v with
2660+
| Pat_constant _ -> []
2661+
| Pat_cons (fv, _, pats) -> List.concatMap (fun (p, _) -> bnds_for_pat p) pats
2662+
| Pat_var bv -> [bv_to_binding bv]
2663+
| Pat_dot_term _ -> []
2664+
in
2665+
(List.map inspect_pat pats, List.map bnds_for_pat pats), []
26682666

26692667
let refl_instantiate_implicits (g:env) (e:term) (expected_typ : option term)
26702668
: tac (option (list (bv & typ) & term & typ) & issues) =
@@ -2714,6 +2712,9 @@ let refl_instantiate_implicits (g:env) (e:term) (expected_typ : option term)
27142712

27152713
dbg_refl g (fun _ -> BU.format2 "refl_instantiate_implicits: inferred %s : %s" (show e) (show t));
27162714

2715+
// Stop now if we've already logged errors, it's less confusing to the user.
2716+
Errors.stop_if_err ();
2717+
27172718
if not (no_univ_uvars_in_term e)
27182719
then Errors.raise_error e Errors.Error_UnexpectedUnresolvedUvar
27192720
(BU.format1 "Elaborated term has unresolved univ uvars: %s" (show e));

src/tactics/FStarC.Tactics.V2.Basic.fsti

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ val refl_core_check_term_at_type : env -> term -> typ -> tac (option Core.t
140140
val refl_tc_term : env -> term -> tac (option (term & (Core.tot_or_ghost & typ)) & issues)
141141
val refl_universe_of : env -> term -> tac (option universe & issues)
142142
val refl_check_prop_validity : env -> term -> tac (option unit & issues)
143-
val refl_check_match_complete : env -> term -> term -> list pattern -> tac (option (list pattern & list (list RD.binding)))
143+
val refl_check_match_complete : env -> term -> term -> list pattern -> tac (option (list pattern & list (list RD.binding)) & issues)
144144
val refl_instantiate_implicits : env -> term -> expected_typ:option term -> tac (option (list (bv & typ) & term & typ) & issues)
145145
val refl_try_unify : env -> list (bv & typ) -> term -> term -> tac (option (list (bv & term)) & issues)
146146
val refl_maybe_relate_after_unfolding : env -> term -> term -> tac (option Core.side & issues)

src/typechecker/FStarC.TypeChecker.Core.fst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,8 @@ let check_bqual (b0 b1:bqual)
429429
//we don't care about the inaccessibility qualifier
430430
//when comparing bquals
431431
return ()
432+
| Some Equality, None
433+
| None, Some Equality // The equality qualifier is metadata, ignore it
432434
| Some Equality, Some Equality ->
433435
return ()
434436
| Some (Meta t1), Some (Meta t2) when equal_term t1 t2 ->

src/typechecker/FStarC.TypeChecker.Rel.fst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2757,6 +2757,8 @@ and solve_binders (bs1:binders) (bs2:binders) (orig:prob) (wl:worklist)
27572757
match a1, a2 with
27582758
| Some (Implicit b1), Some (Implicit b2) ->
27592759
true //we don't care about comparing the dot qualifier in this context
2760+
| Some Equality, None | None, Some Equality ->
2761+
true // also don't care about the equality qualifier
27602762
| _ ->
27612763
U.eq_bqual a1 a2
27622764
in

tests/tactics/CheckMatchComplete.fst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,36 @@ let guard (b:bool) =
99
let test_wild () : Tac unit =
1010
let pat = Reflection.V2.Pat_Var (Sealed.seal (`int)) (Sealed.seal "x") in
1111
let e = cur_env () in
12-
let r = check_match_complete e (`1) (`int) [pat] in
12+
let (r, _) = check_match_complete e (`1) (`int) [pat] in
1313
guard (Some? r)
1414
let _ = assert True by (test_wild ())
1515

1616
let test_const_ok () : Tac unit =
1717
let pat = Reflection.V2.Pat_Constant (C_Int 1) in
1818
let e = cur_env () in
19-
let r = check_match_complete e (`1) (`int) [pat] in
19+
let (r, _) = check_match_complete e (`1) (`int) [pat] in
2020
guard (Some? r)
2121
let _ = assert True by (test_const_ok ())
2222

2323
let test_const_bad () : Tac unit =
2424
let pat = Reflection.V2.Pat_Constant (C_Int 2) in
2525
let e = cur_env () in
26-
let r = check_match_complete e (`1) (`int) [pat] in
26+
let (r, _) = check_match_complete e (`1) (`int) [pat] in
2727
guard (None? r)
2828
let _ = assert True by (test_const_bad ())
2929

3030
let test_const_two () : Tac unit =
3131
let pat1 = Reflection.V2.Pat_Constant (C_Int 1) in
3232
let pat2 = Reflection.V2.Pat_Var (Sealed.seal (`int)) (Sealed.seal "x") in
3333
let e = cur_env () in
34-
let r = check_match_complete e (`1) (`int) [pat1; pat2] in
34+
let (r, _) = check_match_complete e (`1) (`int) [pat1; pat2] in
3535
guard (Some? r)
3636
let _ = assert True by (test_const_two ())
3737

3838
let test_const_two' () : Tac unit =
3939
let pat1 = Reflection.V2.Pat_Constant (C_Int 2) in
4040
let pat2 = Reflection.V2.Pat_Var (Sealed.seal (`int)) (Sealed.seal "x") in
4141
let e = cur_env () in
42-
let r = check_match_complete e (`1) (`int) [pat1; pat2] in
42+
let (r, _) = check_match_complete e (`1) (`int) [pat1; pat2] in
4343
guard (Some? r)
4444
let _ = assert True by (test_const_two' ())

ulib/FStar.Stubs.Tactics.V2.Builtins.fsti

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,9 +555,10 @@ val check_prop_validity (g:env) (t:term)
555555
val match_complete_token (g:env) (sc:term) (t:typ) (pats:list pattern) (bnds:list (list binding))
556556
: Type0
557557

558-
// Returns elaborated patterns, the bindings for each one, and a token
558+
// Returns elaborated patterns, the bindings for each one, and a token. Possibly some issues
559+
// too.
559560
val check_match_complete (g:env) (sc:term) (t:typ) (pats:list pattern)
560-
: Tac (option (pats_bnds:(list pattern & list (list binding))
561+
: Tac (ret_t (pats_bnds:(list pattern & list (list binding))
561562
{match_complete_token g sc t (fst pats_bnds) (snd pats_bnds)
562563
/\ List.Tot.length (fst pats_bnds) == List.Tot.length (snd pats_bnds)
563564
/\ List.Tot.length (fst pats_bnds) == List.Tot.length pats}))

0 commit comments

Comments
 (0)