aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraspiwack2012-04-18 14:47:39 +0000
committeraspiwack2012-04-18 14:47:39 +0000
commite984ac1984bb1e2d102b6c3c93ddcbdd5f689b23 (patch)
treec67f7bb53b4969d7adaa8efbc9cb1eb61f140896
parentb98e5c6662e4e6ef3b9ba8da6da9cb1fda63e2a8 (diff)
Corrects a bug in the refine tactic which could drop evar bodies.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@15205 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--pretyping/evarutil.ml13
1 files changed, 13 insertions, 0 deletions
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml
index 2a2b933daf..da99436cad 100644
--- a/pretyping/evarutil.ml
+++ b/pretyping/evarutil.ml
@@ -200,6 +200,19 @@ let evars_to_metas sigma (emap, c) =
let emap = nf_evar_map_undefined emap in
let sigma',emap' = push_dependent_evars sigma emap in
let sigma',emap' = push_duplicated_evars sigma' emap' c in
+ (* if an evar has been instantiated in [emap] (as part of typing [c])
+ then it is instantiated in [sigma]. *)
+ let repair_evars sigma emap =
+ fold_undefined begin fun ev _ sigma' ->
+ try
+ let info = find emap ev in
+ match evar_body info with
+ | Evar_empty -> sigma'
+ | Evar_defined body -> define ev body sigma'
+ with Not_found -> sigma'
+ end sigma sigma
+ in
+ let sigma' = repair_evars sigma' emap in
let change_exist evar =
let ty = nf_betaiota emap (existential_type emap evar) in
let n = new_meta() in