@@ -260,10 +260,11 @@ let register_rewrite_rules rules env =
260260 symb_pats = List. fold_left (fun symb_pats (c , r ) -> Cmap_env. update c (add c r) symb_pats) env.symb_pats rules.rewrules_rules
261261 }
262262
263- let sync_rewrite_rules prev_rules env =
263+ let sync_rewrite_rules ~ type_mode prev_rules env =
264264 let rrset = match get_enabled_rewrite_rules env with rrset -> rrset | exception RewriteRulesNotAllowed _ ->
265265 anomaly Pp. (str" Trying to remove \" -allowed-rewrite-rules\" flag" )
266266 in
267+ let rrset = if type_mode then Option. default rrset env.env_typing_flags.enabled_rewrite_rules_type else rrset in
267268 let prev_rules = Option. default RRset. empty prev_rules in
268269 (* Efficient symmetric difference function ? *)
269270 let new_rules, removed_rules = RRset. diff rrset prev_rules, RRset. diff prev_rules rrset in
@@ -279,8 +280,30 @@ let sync_rewrite_rules prev_rules env =
279280 register_rewrite_rules rr env)
280281 rules_to_add env
281282
283+ let rewrite_rules_type_different env = Option. has_some env.env_typing_flags.enabled_rewrite_rules_type
284+
285+ let resync_rewrite_rules_type env =
286+ if rewrite_rules_type_different env then
287+ sync_rewrite_rules ~type_mode: false None env
288+ else
289+ env
290+
291+ let resync_rewrite_rules_body env =
292+ let type_rr = env.env_typing_flags.enabled_rewrite_rules_type in
293+ if Option. has_some type_rr then
294+ sync_rewrite_rules ~type_mode: false type_rr env
295+ else
296+ env
297+
282298let enable_rewrite_rules_flags kn flags =
283- { flags with enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags)) }
299+ { flags with
300+ enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags));
301+ enabled_rewrite_rules_type = Option. map (RRset. add kn) flags.enabled_rewrite_rules_type; }
302+
303+ let enable_rewrite_rules_proof_flags kn flags =
304+ { flags with
305+ enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags));
306+ enabled_rewrite_rules_type = Some (get_enabled_rewrite_rules_flags flags) }
284307
285308let enable_rewrite_rules kn env =
286309 let env = { env with env_typing_flags = enable_rewrite_rules_flags kn env.env_typing_flags } in
@@ -582,6 +605,7 @@ let same_flags {
582605 sprop_allowed;
583606 allow_uip;
584607 enabled_rewrite_rules;
608+ enabled_rewrite_rules_type;
585609 } alt =
586610 check_guarded == alt.check_guarded &&
587611 check_positive == alt.check_positive &&
@@ -594,23 +618,29 @@ let same_flags {
594618 impredicative_set == alt.impredicative_set &&
595619 sprop_allowed == alt.sprop_allowed &&
596620 allow_uip == alt.allow_uip &&
597- enabled_rewrite_rules == alt.enabled_rewrite_rules
621+ enabled_rewrite_rules == alt.enabled_rewrite_rules &&
622+ enabled_rewrite_rules_type == alt.enabled_rewrite_rules_type
598623[@ warning " +9" ]
599624
600625let set_type_in_type b = map_universes (UGraph. set_type_in_type b)
601626
602- let set_typing_flags c env =
627+ let set_typing_flags ? type_mode c env =
603628 if same_flags env.env_typing_flags c then env
604629 else
630+ let () = if Option. is_empty type_mode && Option. has_some c.enabled_rewrite_rules_type then
631+ CErrors. user_err Pp. (str" Proof rewrite rules are only supported for opaque definitions" )
632+ in
633+ let type_mode = Option. default false type_mode in
605634 let newenv = { env with env_typing_flags = c } in
606635 let newenv = set_type_in_type (not c.check_universes) newenv in
607- if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules then
636+ if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules &&
637+ env.env_typing_flags.enabled_rewrite_rules_type == c.enabled_rewrite_rules_type then
608638 newenv
609639 else
610- sync_rewrite_rules env.env_typing_flags.enabled_rewrite_rules newenv
640+ sync_rewrite_rules ~type_mode ( if type_mode then env.env_typing_flags.enabled_rewrite_rules_type else env.env_typing_flags. enabled_rewrite_rules) newenv
611641
612- let update_typing_flags ?typing_flags env =
613- Option. cata (fun flags -> set_typing_flags flags env) env typing_flags
642+ let update_typing_flags ?type_mode ? typing_flags env =
643+ Option. cata (fun flags -> set_typing_flags ?type_mode flags env) env typing_flags
614644
615645let set_impredicative_set b env =
616646 set_typing_flags {env.env_typing_flags with impredicative_set= b} env
0 commit comments