From 0a2d03537beaf5ba2ca07176cccba6ce6c6532b2 Mon Sep 17 00:00:00 2001 From: msozeau Date: Mon, 23 Jan 2012 20:51:29 +0000 Subject: Fix for Program Instance not separately checking the resolution of evars of the type (mandatory) and the fields (optional) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@14940 85f007b7-540e-0410-9357-904b9bb8a0f7 --- plugins/subtac/subtac_cases.ml | 2 +- plugins/subtac/subtac_classes.ml | 2 +- pretyping/typeclasses.ml | 17 +++++++++++------ pretyping/typeclasses.mli | 1 + 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/subtac/subtac_cases.ml b/plugins/subtac/subtac_cases.ml index 368d8bac3..16d4e21ee 100644 --- a/plugins/subtac/subtac_cases.ml +++ b/plugins/subtac/subtac_cases.ml @@ -1845,7 +1845,7 @@ let build_dependent_signature env evars avoid tomatchs arsign = refl_arg :: refl_args, pred slift, (Name id, b, t) :: argsign')) - (env, 0, [], [], slift, []) args argsign + (env, neqs, [], [], slift, []) args argsign in let eq = mk_JMeq (lift (nargeqs + slift) appt) diff --git a/plugins/subtac/subtac_classes.ml b/plugins/subtac/subtac_classes.ml index c08dd16df..4b53a2038 100644 --- a/plugins/subtac/subtac_classes.ml +++ b/plugins/subtac/subtac_classes.ml @@ -108,7 +108,7 @@ let new_instance ?(global=false) ctx (instid, bk, cl) props ?(generalize=true) p Namegen.next_global_ident_away i (Termops.ids_of_context env) in let env' = push_rel_context ctx env in - evars := Evarutil.nf_evar_map !evars; + evars := Typeclasses.mark_resolvables (Evarutil.nf_evar_map !evars); evars := resolve_typeclasses ~onlyargs:false ~fail:true env !evars; let sigma = !evars in let subst = List.map (Evarutil.nf_evar sigma) subst in diff --git a/pretyping/typeclasses.ml b/pretyping/typeclasses.ml index e85f174e0..d8a09f95c 100644 --- a/pretyping/typeclasses.ml +++ b/pretyping/typeclasses.ml @@ -473,19 +473,24 @@ let is_resolvable evi = assert (evi.evar_body = Evar_empty); Option.default true (resolvable.get evi.evar_extra) -let mark_unresolvable_undef evi = - let t = resolvable.set false evi.evar_extra in +let mark_resolvability_undef b evi = + let t = resolvable.set b evi.evar_extra in { evi with evar_extra = t } -let mark_unresolvable evi = +let mark_resolvability b evi = assert (evi.evar_body = Evar_empty); - mark_unresolvable_undef evi + mark_resolvability_undef false evi -let mark_unresolvables sigma = +let mark_unresolvable evi = mark_resolvability false evi + +let mark_resolvability b sigma = Evd.fold_undefined (fun ev evi evs -> - Evd.add evs ev (mark_unresolvable_undef evi)) + Evd.add evs ev (mark_resolvability_undef b evi)) sigma (Evd.defined_evars sigma) +let mark_unresolvables sigma = mark_resolvability false sigma +let mark_resolvables sigma = mark_resolvability true sigma + let has_typeclasses evd = Evd.fold_undefined (fun ev evi has -> has || (is_class_evar evd evi && is_resolvable evi)) diff --git a/pretyping/typeclasses.mli b/pretyping/typeclasses.mli index 74ccaf834..b49eeac4f 100644 --- a/pretyping/typeclasses.mli +++ b/pretyping/typeclasses.mli @@ -84,6 +84,7 @@ val instance_constructor : typeclass -> constr list -> constr option * types val is_resolvable : evar_info -> bool val mark_unresolvable : evar_info -> evar_info val mark_unresolvables : evar_map -> evar_map +val mark_resolvables : evar_map -> evar_map val is_class_evar : evar_map -> evar_info -> bool val resolve_typeclasses : ?onlyargs:bool -> ?split:bool -> ?fail:bool -> -- cgit v1.2.3