Skip to content

Commit ff232c8

Browse files
committed
Allow erasure of case predicate and cast annotation
1 parent 9dbdb01 commit ff232c8

1 file changed

Lines changed: 15 additions & 15 deletions

File tree

kernel/inductive.ml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,20 +1552,20 @@ let check_one_fix ?evars renv recpos trees def =
15521552

15531553
| Case (ci, u, pms, ret, iv, c_0, br) -> (* iv ignored: it's just a cache *)
15541554
let (ci, (p,_), _iv, c_0, brs) = expand_case renv.env (ci, u, pms, ret, iv, c_0, br) in
1555-
let needreduce_c_0, rs = check_in_redex renv rs c_0 in
1555+
let rs = push_redex rs in
1556+
let rs = check_term renv rs c_0 in
15561557
let rs = check_term renv rs p in
15571558
(* compute the recarg info for the arguments of each branch *)
1558-
let rs' = push_redex rs in
1559-
let nr = redex_level rs' in
1559+
let nr = redex_level rs in
15601560
let c_spec = Subterm.make_internal nr (lazy_subterm_specif ?evars renv [] c_0) in
15611561
let case_spec = Subterm.on_branches renv.env ci.ci_ind c_spec in
15621562
let stack' = filter_stack_domain stack_element_specif (Lazy.from_val (Subterm.internal nr)) ?evars renv.env p stack in
1563-
let rs' =
1563+
let rs =
15641564
Array.fold_left_i (fun k rs' br' ->
15651565
let stack_br = push_stack_args (case_spec k) stack' in
1566-
check_in_stack renv stack_br rs' br') rs' brs in
1567-
let needreduce_br, rs = pop_redex rs' in
1568-
check_needreduce renv (needreduce_br ||| needreduce_c_0) stack rs (fun () ->
1566+
check_in_stack renv stack_br rs' br') rs brs in
1567+
let needreduce, rs = pop_redex rs in
1568+
check_needreduce renv needreduce stack rs (fun () ->
15691569
(* we try hard to reduce the match away by looking for a
15701570
constructor in c_0 (we unfold definitions too) *)
15711571
let hd, args = reduce_and_contract_cofix ?evars renv.env c_0 in
@@ -1591,8 +1591,8 @@ let check_one_fix ?evars renv recpos trees def =
15911591
| Fix ((recindxs,i),(_,typarray,bodies as recdef) as fix) ->
15921592
let decrArg = recindxs.(i) in
15931593
let nbodies = Array.length bodies in
1594-
let rs' = push_redex rs in
1595-
let rs' = Array.fold_left (check_term renv) rs' typarray in
1594+
let rs = push_redex rs in
1595+
let rs = Array.fold_left (check_term renv) rs typarray in
15961596
let renv' = push_fix_renv renv recdef in
15971597
let nuniformparams = find_uniform_parameters recindxs (List.length stack) bodies in
15981598
let bodies = drop_uniform_parameters nuniformparams bodies in
@@ -1605,10 +1605,10 @@ let check_one_fix ?evars renv recpos trees def =
16051605
error_ill_formed_rec_body renv.env (Type_errors.FixGuardError (NotEnoughAbstractionInFixBody recindxs.(i)))
16061606
(pi1 recdef) i (push_rec_types recdef renv.env)
16071607
(judgment_of_fixpoint recdef) in
1608-
let rs' = Array.fold_left2_i (fun j rs' recindx body ->
1608+
let rs = Array.fold_left2_i (fun j rs recindx body ->
16091609
let fix_stack = if Int.equal i j then stack_this else stack_others in
1610-
check_nested_fix_body illformed renv' (recindx+1) fix_stack rs' body) rs' recindxs bodies in
1611-
let needreduce, rs = pop_redex rs' in
1610+
check_nested_fix_body illformed renv' (recindx+1) fix_stack rs body) rs recindxs bodies in
1611+
let needreduce, rs = pop_redex rs in
16121612
let absorbed_stack, non_absorbed_stack = List.chop nuniformparams stack in
16131613
check_needreduce renv needreduce non_absorbed_stack rs (fun () ->
16141614
(* we try hard to reduce the fix away by looking for a
@@ -1696,9 +1696,9 @@ let check_one_fix ?evars renv recpos trees def =
16961696
end
16971697

16981698
| Cast (c,_,t) ->
1699-
let rs = check_term renv rs t in
1700-
let rs = check_in_stack renv stack rs c in
1701-
rs
1699+
let _, rs = check_in_redex renv rs t in
1700+
(* The type annotation is erased by cast erasure *)
1701+
check_in_stack renv stack rs c
17021702

17031703
| Sort _ | Int _ | Float _ | String _ ->
17041704
(* See [Prod]: we cannot ensure that the stack is empty *)

0 commit comments

Comments
 (0)