Skip to content

Commit d5891eb

Browse files
committed
Print evars instead of metas in Clenv unification failures
1 parent 931dad3 commit d5891eb

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

proofs/clenv.ml

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,46 @@ 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+
412434
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
435+
try
436+
let metas = clenv.metam in
437+
let metas, sigma = w_unify ~metas ~flags clenv.env clenv.evd cv_pb t1 t2 in
438+
update_clenv_evd clenv sigma metas
439+
with Pretype_errors.(PretypeError (env, sigma, CannotUnify (t1, t2, reason))) ->
440+
let sigma, f = replace_clenv_metas env sigma clenv in
441+
raise (Pretype_errors.(PretypeError (env, sigma, CannotUnify (f t1, f t2, reason))))
442+
416443

417444
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
445+
try
446+
let metas = clenv.metam in
447+
let metas, sigma = w_unify_meta_types ~metas ~flags:flags clenv.env clenv.evd in
448+
update_clenv_evd clenv sigma metas
449+
with Pretype_errors.(PretypeError (env, sigma, CannotUnify (t1, t2, reason))) ->
450+
let sigma, f = replace_clenv_metas env sigma clenv in
451+
raise (Pretype_errors.(PretypeError (env, sigma, CannotUnify (f t1, f t2, reason))))
421452

422453
let clenv_unique_resolver ?(flags=default_unify_flags ()) clenv concl =
423454
let metas = meta_handler clenv.metam in

0 commit comments

Comments
 (0)