Skip to content

Commit 32972f6

Browse files
committed
[ fix ] Accept not fully applied impossible clauses
1 parent f6f34b6 commit 32972f6

File tree

8 files changed

+66
-16
lines changed

8 files changed

+66
-16
lines changed

src/TTImp/Impossible.idr

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,58 +66,67 @@ mutual
6666
processArgs : {auto c : Ref Ctxt Defs} ->
6767
{auto s : Ref Syn SyntaxInfo} ->
6868
{auto q : Ref QVar Int} ->
69+
Bool -> -- should be fully applied
6970
ClosedTerm -> ClosedNF ->
7071
(expargs : List RawImp) ->
7172
(autoargs : List RawImp) ->
7273
(namedargs : List (Name, RawImp)) ->
7374
Core ClosedTerm
7475
-- unnamed takes priority
75-
processArgs fn (NBind fc x (Pi _ _ Explicit ty) sc) (e :: exps) autos named
76+
processArgs con fn (NBind fc x (Pi _ _ Explicit ty) sc) (e :: exps) autos named
7677
= do e' <- mkTerm e (Just ty) [] [] []
7778
defs <- get Ctxt
78-
processArgs (App fc fn e') !(sc defs (toClosure defaultOpts Env.empty e'))
79+
processArgs con (App fc fn e')
80+
!(sc defs (toClosure defaultOpts Env.empty e'))
7981
exps autos named
80-
processArgs fn (NBind fc x (Pi _ _ Explicit ty) sc) [] autos named
82+
processArgs con fn (NBind fc x (Pi _ _ Explicit ty) sc) [] autos named
8183
= do defs <- get Ctxt
8284
case findNamed x named of
8385
Just ((_, e), named') =>
8486
do e' <- mkTerm e (Just ty) [] [] []
85-
processArgs (App fc fn e') !(sc defs (toClosure defaultOpts Env.empty e'))
87+
processArgs con (App fc fn e')
88+
!(sc defs (toClosure defaultOpts Env.empty e'))
8689
[] autos named'
87-
Nothing => badClause fn [] autos named
88-
processArgs fn (NBind fc x (Pi _ _ Implicit ty) sc) exps autos named
90+
Nothing => -- Expected an explicit argument, but only implicits left
91+
if not con && null autos && null named
92+
then pure fn
93+
else badClause fn [] autos named
94+
processArgs con fn (NBind fc x (Pi _ _ Implicit ty) sc) exps autos named
8995
= do defs <- get Ctxt
9096
case findNamed x named of
9197
Nothing => do e' <- nextVar fc
92-
processArgs (App fc fn e')
98+
processArgs con (App fc fn e')
9399
!(sc defs (toClosure defaultOpts Env.empty e'))
94100
exps autos named
95101
Just ((_, e), named') =>
96102
do e' <- mkTerm e (Just ty) [] [] []
97-
processArgs (App fc fn e') !(sc defs (toClosure defaultOpts Env.empty e'))
103+
processArgs con (App fc fn e')
104+
!(sc defs (toClosure defaultOpts Env.empty e'))
98105
exps autos named'
99-
processArgs fn (NBind fc x (Pi _ _ AutoImplicit ty) sc) exps autos named
106+
processArgs con fn (NBind fc x (Pi _ _ AutoImplicit ty) sc) exps autos named
100107
= do defs <- get Ctxt
101108
case autos of
102109
(e :: autos') => -- unnamed takes priority
103110
do e' <- mkTerm e (Just ty) [] [] []
104-
processArgs (App fc fn e') !(sc defs (toClosure defaultOpts Env.empty e'))
111+
processArgs con (App fc fn e')
112+
!(sc defs (toClosure defaultOpts Env.empty e'))
105113
exps autos' named
106114
[] =>
107115
case findNamed x named of
108116
Nothing =>
109117
do e' <- nextVar fc
110-
processArgs (App fc fn e')
118+
processArgs con (App fc fn e')
111119
!(sc defs (toClosure defaultOpts Env.empty e'))
112120
exps [] named
113121
Just ((_, e), named') =>
114122
do e' <- mkTerm e (Just ty) [] [] []
115-
processArgs (App fc fn e') !(sc defs (toClosure defaultOpts Env.empty e'))
123+
processArgs con (App fc fn e')
124+
!(sc defs (toClosure defaultOpts Env.empty e'))
116125
exps [] named'
117-
processArgs fn ty [] [] [] = pure fn
118-
processArgs fn ty (x :: _) autos named
126+
processArgs _ fn _ [] [] [] = pure fn
127+
processArgs _ fn _ (x :: _) autos named
119128
= throw $ GenericMsg (getFC x) "Too many arguments"
120-
processArgs fn ty exps autos named
129+
processArgs _ fn _ exps autos named
121130
= badClause fn exps autos named
122131

123132
buildApp : {auto c : Ref Ctxt Defs} ->
@@ -148,7 +157,10 @@ mutual
148157
-- When `head` is `Func`, the pattern will be marked as forced and
149158
-- the coverage checker will considers that all the cases have been
150159
-- covered!
151-
processArgs (Ref fc (getDefNameType gdef) (Resolved i)) tynf exps autos named
160+
let nameType = getDefNameType gdef
161+
processArgs (isJust $ isCon nameType)
162+
(Ref fc nameType (Resolved i))
163+
tynf exps autos named
152164

153165
mkTerm : {auto c : Ref Ctxt Defs} ->
154166
{auto s : Ref Syn SyntaxInfo} ->
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
interface Cogen a where
2+
constructor MkCogen
3+
perturb : a -> Nat -> Nat
4+
5+
Cogen Void where
6+
perturb _ impossible
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
foo : Void -> Nat -> Nat
2+
foo _ impossible
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1/1: Building Main (Main.idr)
2+
1/1: Building Issue3679 (Issue3679.idr)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
. ../../../testutils.sh
2+
3+
check Main.idr
4+
check Issue3679.idr
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
foo : Nat -> Nat
2+
foo S impossible
3+
foo Z = Z
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
1/1: Building Main (Main.idr)
2+
Warning: Main:2:5--2:6:Badly formed impossible clause (Prelude.Types.S, ([], ([], [])))
3+
4+
Main:2:5--2:6
5+
1 | foo : Nat -> Nat
6+
2 | foo S impossible
7+
^
8+
9+
Error: foo is not covering.
10+
11+
Main:1:1--1:17
12+
1 | foo : Nat -> Nat
13+
^^^^^^^^^^^^^^^^
14+
15+
Missing cases:
16+
foo (S _)
17+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
. ../../../testutils.sh
2+
3+
# expect a coverage error
4+
check Main.idr

0 commit comments

Comments
 (0)