aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormsozeau2010-02-22 01:40:01 +0000
committermsozeau2010-02-22 01:40:01 +0000
commit5dba392f32f0da65a4f0331186e75b35fffa1bb7 (patch)
tree5aeecbb22ba02626cc0d30df744a7841918ed94d
parent8db86b3a3d531c44d9a52cc5519122e5a3af3ed9 (diff)
Improve unification when evars and metas are mixed.
If we can't mimick a rhs in an ?evar = rhs situation, we first turn all metas in rhs into evars before trying to solve the equation. Problem reported by Eelis van der Weegen. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12801 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--pretyping/unification.ml11
1 files changed, 8 insertions, 3 deletions
diff --git a/pretyping/unification.ml b/pretyping/unification.ml
index d26195efc8..32b51eac49 100644
--- a/pretyping/unification.ml
+++ b/pretyping/unification.ml
@@ -637,11 +637,16 @@ let w_merge env with_types flags (evd,metas,evars) =
else begin
let rhs' = subst_meta_instances metas rhs in
match kind_of_term rhs with
- | App (f,cl) when is_mimick_head f & occur_meta rhs' ->
+ | App (f,cl) when occur_meta rhs' ->
if occur_evar evn rhs' then
error_occur_check env evd evn rhs';
- let evd' = mimick_evar evd flags f (Array.length cl) evn in
- w_merge_rec evd' metas evars eqns
+ if is_mimick_head f then
+ let evd' = mimick_evar evd flags f (Array.length cl) evn in
+ w_merge_rec evd' metas evars eqns
+ else
+ let evd', rhs'' = pose_all_metas_as_evars env evd rhs' in
+ w_merge_rec (solve_simple_evar_eqn env evd' ev rhs'')
+ metas evars' eqns
| _ ->
w_merge_rec (solve_simple_evar_eqn env evd ev rhs')
metas evars' eqns