aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorherbelin2010-04-05 08:49:12 +0000
committerherbelin2010-04-05 08:49:12 +0000
commit27b03e960f936b4de1736b3177e318797c137e0e (patch)
tree656e0b56b258cf1c682aef42ad7a8a3ce8a06213
parent103fc347e7f159109667af89293da3d90c7b3a29 (diff)
Partial fix to bug #2244 (ensure that pattern unification does not
abstract over Meta's by first posing the Meta's as Evar's). git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12898 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--pretyping/unification.ml37
1 files changed, 19 insertions, 18 deletions
diff --git a/pretyping/unification.ml b/pretyping/unification.ml
index 438a584698..22527a1b1a 100644
--- a/pretyping/unification.ml
+++ b/pretyping/unification.ml
@@ -100,6 +100,24 @@ let rec subst_meta_instances bl c =
| Meta i -> (try assoc_pair i bl with Not_found -> c)
| _ -> map_constr (subst_meta_instances bl) c
+let pose_all_metas_as_evars env evd t =
+ let evdref = ref evd in
+ let rec aux t = match kind_of_term t with
+ | Meta mv ->
+ (match Evd.meta_opt_fvalue !evdref mv with
+ | Some ({rebus=c},_) -> c
+ | None ->
+ let {rebus=ty;freemetas=mvs} = Evd.meta_ftype evd mv in
+ let ty = if mvs = Evd.Metaset.empty then ty else aux ty in
+ let ev = Evarutil.e_new_evar evdref env ~src:(dummy_loc,GoalEvar) ty in
+ evdref := meta_assign mv (ev,(ConvUpToEta 0,TypeNotProcessed)) !evdref;
+ ev)
+ | _ ->
+ map_constr aux t in
+ let c = aux t in
+ (* side-effect *)
+ (!evdref, c)
+
let solve_pattern_eqn_array (env,nb) f l c (sigma,metasubst,evarsubst) =
match kind_of_term f with
| Meta k ->
@@ -110,6 +128,7 @@ let solve_pattern_eqn_array (env,nb) f l c (sigma,metasubst,evarsubst) =
sigma,(k,lift (-nb) c,pb)::metasubst,evarsubst
else error_cannot_unify_local env sigma (mkApp (f, l),c,c)
| Evar ev ->
+ let sigma,c = pose_all_metas_as_evars env sigma c in
sigma,metasubst,(ev,solve_pattern_eqn env (Array.to_list l) c)::evarsubst
| _ -> assert false
@@ -533,24 +552,6 @@ let is_mimick_head f =
(Const _|Var _|Rel _|Construct _|Ind _) -> true
| _ -> false
-let pose_all_metas_as_evars env evd t =
- let evdref = ref evd in
- let rec aux t = match kind_of_term t with
- | Meta mv ->
- (match Evd.meta_opt_fvalue !evdref mv with
- | Some ({rebus=c},_) -> c
- | None ->
- let {rebus=ty;freemetas=mvs} = Evd.meta_ftype evd mv in
- let ty = if mvs = Evd.Metaset.empty then ty else aux ty in
- let ev = Evarutil.e_new_evar evdref env ~src:(dummy_loc,GoalEvar) ty in
- evdref := meta_assign mv (ev,(ConvUpToEta 0,TypeNotProcessed)) !evdref;
- ev)
- | _ ->
- map_constr aux t in
- let c = aux t in
- (* side-effect *)
- (!evdref, c)
-
let try_to_coerce env evd c cty tycon =
let j = make_judge c cty in
let (evd',j') = inh_conv_coerce_rigid_to dummy_loc env evd j tycon in