@@ -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+
412435let 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
417445let 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
422454let clenv_unique_resolver ?(flags =default_unify_flags () ) clenv concl =
423455 let metas = meta_handler clenv.metam in
0 commit comments