Skip to content

Commit 1123dee

Browse files
committed
Print evars instead of metas in Clenv unification failures
1 parent db6bc65 commit 1123dee

File tree

4 files changed

+47
-29
lines changed

4 files changed

+47
-29
lines changed

proofs/clenv.ml

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,47 @@ let clenv_missing ce =
409409

410410
(******************************************************************)
411411

412+
let rec subst_meta sigma s c =
413+
match kind sigma c with
414+
| Meta i -> (try Int.Map.find i s with Not_found -> c)
415+
| _ -> EConstr.map sigma (subst_meta sigma s) c
416+
417+
let replace_clenv_metas env sigma clnv =
418+
let module Metas = Unification.Meta in
419+
let metam = clenv_meta_list clnv in
420+
let sigma, metamap = List.fold_left (fun (sigma, metamap) mv ->
421+
let tymeta = Metas.meta_ftype metam mv in
422+
let ty = subst_meta sigma metamap tymeta.rebus in
423+
let naming = match Metas.meta_name metam mv with
424+
| Name na -> Namegen.IntroIdentifier na
425+
| Anonymous -> Namegen.IntroAnonymous
426+
in
427+
let sigma, ev = Evarutil.new_evar ~naming env sigma ty in
428+
sigma, Int.Map.add mv ev metamap)
429+
(sigma, Int.Map.empty) (clenv_arguments clnv)
430+
in
431+
sigma, subst_meta sigma metamap
432+
433+
exception ClenvCannotUnify of env * evar_map * clausenv * econstr * econstr * unification_error option
434+
412435
let clenv_unify ?(flags=default_unify_flags ()) cv_pb t1 t2 clenv =
413-
let metas = clenv.metam in
414-
let metas, sigma = w_unify ~metas ~flags clenv.env clenv.evd cv_pb t1 t2 in
415-
update_clenv_evd clenv sigma metas
436+
try
437+
let metas = clenv.metam in
438+
let metas, sigma = w_unify ~metas ~flags clenv.env clenv.evd cv_pb t1 t2 in
439+
update_clenv_evd clenv sigma metas
440+
with Pretype_errors.(PretypeError (env, sigma, CannotUnify (t1, t2, reason))) as exn ->
441+
let _, info = Exninfo.capture exn in
442+
Exninfo.iraise (ClenvCannotUnify (env, sigma, clenv, t1, t2, reason), info)
443+
416444

417445
let clenv_unify_meta_types ?(flags=default_unify_flags ()) clenv =
418-
let metas = clenv.metam in
419-
let metas, sigma = w_unify_meta_types ~metas ~flags:flags clenv.env clenv.evd in
420-
update_clenv_evd clenv sigma metas
446+
try
447+
let metas = clenv.metam in
448+
let metas, sigma = w_unify_meta_types ~metas ~flags:flags clenv.env clenv.evd in
449+
update_clenv_evd clenv sigma metas
450+
with Pretype_errors.(PretypeError (env, sigma, CannotUnify (t1, t2, reason))) as exn ->
451+
let _, info = Exninfo.capture exn in
452+
Exninfo.iraise (ClenvCannotUnify (env, sigma, clenv, t1, t2, reason), info)
421453

422454
let clenv_unique_resolver ?(flags=default_unify_flags ()) clenv concl =
423455
let metas = meta_handler clenv.metam in

proofs/clenv.mli

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ val case_pf : ?with_evars:bool ->
7777

7878
val clenv_pose_dependent_evars : ?with_evars:bool -> clausenv -> clausenv
7979

80+
val replace_clenv_metas : env -> evar_map -> clausenv -> evar_map * (EConstr.constr -> EConstr.constr)
81+
82+
exception ClenvCannotUnify of env * evar_map * clausenv * econstr * econstr * Pretype_errors.unification_error option
83+
8084
(** {6 Pretty-print (debug only) } *)
8185
val pr_clenv : clausenv -> Pp.t
8286

tactics/hints.ml

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,33 +1632,12 @@ let pr_hint env sigma h = match h.obj with
16321632
| Extern (_, tac) ->
16331633
str "(*external*) " ++ Gentactic.print_glob env sigma ~level:(LevelLe 0) tac
16341634

1635-
let rec subst_meta sigma s c =
1636-
match kind sigma c with
1637-
| Meta i -> (try Int.Map.find i s with Not_found -> c)
1638-
| _ -> EConstr.map sigma (subst_meta sigma s) c
1639-
1640-
let replace_clenv_type_metas env sigma clnv =
1641-
let module Metas = Unification.Meta in
1642-
let metam = Clenv.clenv_meta_list clnv in
1643-
let sigma, metamap = List.fold_left (fun (sigma, metamap) mv ->
1644-
let tymeta = Metas.meta_ftype metam mv in
1645-
let ty = subst_meta sigma metamap tymeta.rebus in
1646-
let naming = match Metas.meta_name metam mv with
1647-
| Name na -> IntroIdentifier na
1648-
| Anonymous -> IntroAnonymous
1649-
in
1650-
let sigma, ev = Evarutil.new_evar ~naming env sigma ty in
1651-
sigma, Int.Map.add mv ev metamap)
1652-
(sigma, Int.Map.empty) (Clenv.clenv_arguments clnv)
1653-
in
1654-
sigma, subst_meta sigma metamap (Clenv.clenv_type clnv)
1655-
16561635
let pr_default_pattern env sigma = function
16571636
| Give_exact h ->
16581637
pr_leconstr_env env sigma h.hint_type
16591638
| Res_pf h | ERes_pf h | Res_pf_THEN_trivial_fail h ->
1660-
let sigma, c = replace_clenv_type_metas env sigma h.hint_clnv in
1661-
pr_leconstr_env env sigma c
1639+
let sigma, f = Clenv.replace_clenv_metas env sigma h.hint_clnv in
1640+
pr_leconstr_env env sigma (f (Clenv.clenv_type h.hint_clnv))
16621641
| Unfold_nth _ | Extern _ ->
16631642
(* These hints cannot contain DefaultPattern *)
16641643
assert false

vernac/himsg.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,6 +1738,9 @@ let rec vernac_interp_error_handler = function
17381738
explain_type_error env (Evd.from_env env) te
17391739
| PretypeError(ctx,sigma,te) ->
17401740
explain_pretype_error ctx sigma te
1741+
| Clenv.ClenvCannotUnify (env, sigma, clenv, t1, t2, reason) ->
1742+
let sigma, f = Clenv.replace_clenv_metas env sigma clenv in
1743+
explain_pretype_error env sigma (CannotUnify (f t1, f t2, reason))
17411744
| PrimNotations.PrimTokenNotationError(kind,ctx,sigma,te) ->
17421745
explain_prim_token_notation_error kind ctx sigma te
17431746
| Typeclasses_errors.TypeClassError(env, sigma, te) ->

0 commit comments

Comments
 (0)