diff options
Diffstat (limited to 'pretyping')
-rw-r--r-- | pretyping/evarutil.ml | 3 | ||||
-rw-r--r-- | pretyping/tacred.ml | 9 |
2 files changed, 11 insertions, 1 deletions
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml index 13ccefe1e..f7b4e1279 100644 --- a/pretyping/evarutil.ml +++ b/pretyping/evarutil.ml @@ -857,6 +857,7 @@ let rec invert_definition env evd (evk,argsv as ev) rhs = | Rel i when i>k -> project_variable env' (mkRel (i-k)) k t | Var id -> project_variable env' t k t | Evar (evk',args' as ev') -> + if evk = evk' then error_occur_check env (evars_of evd) evk rhs; (* Evar/Evar problem (but left evar is virtual) *) let projs' = array_map_to_list @@ -904,6 +905,8 @@ and evar_define env (evk,_ as ev) rhs evd = try let (evd',body) = invert_definition env evd ev rhs in if occur_meta body then error "Meta cannot occur in evar body"; + (* invert_definition may have instantiate some evars of rhs with evk *) + (* so we recheck acyclicity *) if occur_evar evk body then error_occur_check env (evars_of evd) evk body; (* needed only if an inferred type *) let body = refresh_universes body in diff --git a/pretyping/tacred.ml b/pretyping/tacred.ml index 3ee82a685..3b5038766 100644 --- a/pretyping/tacred.ml +++ b/pretyping/tacred.ml @@ -917,7 +917,14 @@ let one_step_reduce env sigma c = let isIndRef = function IndRef _ -> true | _ -> false let reduce_to_ref_gen allow_product env sigma ref t = - if isIndRef ref then snd (reduce_to_ind_gen allow_product env sigma t) else + if isIndRef ref then + let (mind,t) = reduce_to_ind_gen allow_product env sigma t in + if IndRef mind <> ref then + errorlabstrm "" (str "Cannot recognize a statement based on " ++ + Nametab.pr_global_env Idset.empty ref) + else + t + else (* lazily reduces to match the head of [t] with the expected [ref] *) let rec elimrec env t l = let c, _ = Reductionops.whd_stack t in |