diff options
author | 2006-09-23 14:20:54 +0000 | |
---|---|---|
committer | 2006-09-23 14:20:54 +0000 | |
commit | 00c942b5352b4b136802cfc92d36eb9512c4df21 (patch) | |
tree | 5fd7d7592745194b0a672e1a299495a23043e641 | |
parent | 577c6d95f16701190c12c592d13893eff3363ac0 (diff) |
Correction d'un bug de coercion de pattern introduit dans la 8.1beta
(les coercions ne marchaient plus quand le type du terme à filtrer
était connu). Ajout d'un test pour ce bug et pour le bug #1168.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@9169 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r-- | pretyping/cases.ml | 29 | ||||
-rw-r--r-- | test-suite/success/Case13.v | 12 |
2 files changed, 25 insertions, 16 deletions
diff --git a/pretyping/cases.ml b/pretyping/cases.ml index b3cff232b..b2c37f7e6 100644 --- a/pretyping/cases.ml +++ b/pretyping/cases.ml @@ -336,8 +336,8 @@ let inh_coerce_to_ind isevars env ty tyi = un inductif cela doit être égal *) let _ = e_cumul env isevars expected_typ ty in () -let unify_tomatch_with_patterns isevars env typ tm = - match find_row_ind tm with +let unify_tomatch_with_patterns isevars env loc typ pats = + match find_row_ind pats with | None -> NotInd (None,typ) | Some (_,(ind,_)) -> inh_coerce_to_ind isevars env typ ind; @@ -345,29 +345,26 @@ let unify_tomatch_with_patterns isevars env typ tm = with Not_found -> NotInd (None,typ) let find_tomatch_tycon isevars env loc = function - (* Try first if some 'in I ...' is present and can be used as a constraint *) - | Some (_,ind,_,_),_ - (* Otherwise try to get constraints from (the 1st) constructor in clauses *) - | None, Some (_,(ind,_)) -> - mk_tycon (inductive_template isevars env loc ind) - | None, None -> - empty_tycon - -let coerce_row typing_fun isevars env cstropt (tomatch,(_,indopt)) = + (* Try if some 'in I ...' is present and can be used as a constraint *) + | Some (_,ind,_,_) -> mk_tycon (inductive_template isevars env loc ind) + | None -> empty_tycon + +let coerce_row typing_fun isevars env pats (tomatch,(_,indopt)) = let loc = Some (loc_of_rawconstr tomatch) in - let tycon = find_tomatch_tycon isevars env loc (indopt,cstropt) in + let tycon = find_tomatch_tycon isevars env loc indopt in let j = typing_fun tycon env tomatch in let typ = nf_evar (Evd.evars_of !isevars) j.uj_type in - let t = + let t = try IsInd (typ,find_rectype env (Evd.evars_of !isevars) typ) - with Not_found -> NotInd (None,typ) in + with Not_found -> + unify_tomatch_with_patterns isevars env loc typ pats in (j.uj_val,t) let coerce_to_indtype typing_fun isevars env matx tomatchl = let pats = List.map (fun r -> r.patterns) matx in let matx' = match matrix_transpose pats with - | [] -> List.map (fun _ -> None) tomatchl (* no patterns at all *) - | m -> List.map find_row_ind m in + | [] -> List.map (fun _ -> []) tomatchl (* no patterns at all *) + | m -> m in List.map2 (coerce_row typing_fun isevars env) matx' tomatchl (************************************************************************) diff --git a/test-suite/success/Case13.v b/test-suite/success/Case13.v index f19e24b88..f14725a8e 100644 --- a/test-suite/success/Case13.v +++ b/test-suite/success/Case13.v @@ -67,3 +67,15 @@ Check (fun x => match x with | D _ => 1 end). +(* Check coercions against the type of the term to match *) +(* Used to fail in V8.1beta *) + +Inductive C : Set := c : C. +Inductive E : Set := e :> C -> E. +Check fun (x : E) => match x with c => e c end. + +(* Check coercions with uniform parameters (cf bug #1168) *) + +Inductive C' : bool -> Set := c' : C' true. +Inductive E' (b : bool) : Set := e' :> C' b -> E' b. +Check fun (x : E' true) => match x with c' => e' true c' end. |