aboutsummaryrefslogtreecommitdiffhomepage
path: root/kernel
diff options
context:
space:
mode:
authorGravatar Maxime Dénès <mail@maximedenes.fr>2014-04-21 00:18:55 -0400
committerGravatar Maxime Dénès <mail@maximedenes.fr>2014-07-22 17:55:06 -0400
commitb828495753da8f1685e7ca5b6897a580e7bd3f09 (patch)
treec71ec56671b95721aa5ea3975fad5f07f3c9fd61 /kernel
parent4cd0becc84208525443d7ca4e9cc8214d00df319 (diff)
First attempt at a fix for guard condition on cofixpoints.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/inductive.ml5
-rw-r--r--kernel/type_errors.ml1
-rw-r--r--kernel/type_errors.mli1
3 files changed, 7 insertions, 0 deletions
diff --git a/kernel/inductive.ml b/kernel/inductive.ml
index 9cfa5c632..eae4c098d 100644
--- a/kernel/inductive.ml
+++ b/kernel/inductive.ml
@@ -1171,6 +1171,8 @@ let check_one_cofix env nbfix def deftype =
raise (CoFixGuardError (env,UnguardedRecursiveCall c))
| Case (_,p,tm,vrest) ->
+ begin
+ try let _ = codomain_is_coind env p in
if (noccur_with_meta n nbfix p) then
if (noccur_with_meta n nbfix tm) then
if (List.for_all (noccur_with_meta n nbfix) args) then
@@ -1181,6 +1183,9 @@ let check_one_cofix env nbfix def deftype =
raise (CoFixGuardError (env,RecCallInCaseArg c))
else
raise (CoFixGuardError (env,RecCallInCasePred c))
+ with CoFixGuardError _ ->
+ raise (CoFixGuardError (env, ReturnPredicateNotCoInductive c))
+ end
| Meta _ -> ()
| Evar _ ->
diff --git a/kernel/type_errors.ml b/kernel/type_errors.ml
index 30dcbafe6..d0ecf9e9b 100644
--- a/kernel/type_errors.ml
+++ b/kernel/type_errors.ml
@@ -30,6 +30,7 @@ type guard_error =
| RecCallInCaseArg of constr
| RecCallInCasePred of constr
| NotGuardedForm of constr
+ | ReturnPredicateNotCoInductive of constr
type arity_error =
| NonInformativeToInformative
diff --git a/kernel/type_errors.mli b/kernel/type_errors.mli
index 09310b42b..37370377d 100644
--- a/kernel/type_errors.mli
+++ b/kernel/type_errors.mli
@@ -31,6 +31,7 @@ type guard_error =
| RecCallInCaseArg of constr
| RecCallInCasePred of constr
| NotGuardedForm of constr
+ | ReturnPredicateNotCoInductive of constr
type arity_error =
| NonInformativeToInformative