@@ -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+
412434let 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
417444let 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
422453let clenv_unique_resolver ?(flags =default_unify_flags () ) clenv concl =
423454 let metas = meta_handler clenv.metam in
0 commit comments