History

Allow flagging types as externally defined

e.g. in a C file. This means we don't accidentally treat things as empty, since previously we just defined these as empty types, but that broke coverage checking. Fixes #240

Edwin Brady committed 6 years ago

Commit 69a76401 parent 0daece113 files · +84 −15Browse files

Unified · Split

13 files
  1. libs/base/Data/IORef.idr +1 −1
  2. libs/prelude/PrimIO.idr +3 −3
  3. src/Core/Binary.idr +1 −1
  4. src/Core/Context.idr +28 −6
  5. src/Core/Coverage.idr +4 −2
  6. src/Core/TTC.idr +10 −0
  7. src/Idris/Parser.idr +2 −0
  8. src/TTImp/ProcessData.idr +4 −2
  9. src/TTImp/TTImp.idr +4 −0
  10. tests/Main.idr +1 −0
  11. tests/idris2/reg015/anyfail.idr +21 −0
  12. tests/idris2/reg015/expected +2 −0
  13. tests/idris2/reg015/run +3 −0
libs/base/Data/IORef.idr+1−1
@@ -4,7 +4,7 @@ module Data.IORef · 3 unmodified lines
44
55 -- Implemented externally
66 -- e.g., in Scheme, passed around as a box
7−data Mut : Type -> Type
7+data Mut : Type -> Type where [external]
88
99 %extern prim__newIORef : forall a . a -> (1 x : %World) -> IORes (Mut a)
1010 %extern prim__readIORef : forall a . Mut a -> (1 x : %World) -> IORes a
libs/prelude/PrimIO.idr+3−3
@@ -44,14 +44,14 @@ io_bind (MkIO fn) · 43 unmodified lines
4444 -- The parameter is a phantom type, to help differentiate between
4545 -- different pointer types
4646 public export
47−data Ptr : Type -> Type where
47+data Ptr : Type -> Type where [external]
4848
4949 -- A pointer to any type (representing a void* in foreign calls)
5050 public export
51−data AnyPtr : Type where
51+data AnyPtr : Type where [external]
5252
5353 public export
54−data ThreadID : Type where
54+data ThreadID : Type where [external]
5555
5656 public export
5757 data FArgList : Type where
src/Core/Binary.idr+1−1
@@ -27,7 +27,7 @@ import Data.Buffer · 26 unmodified lines
2727 -- TTC files can only be compatible if the version number is the same
2828 export
2929 ttcVersion : Int
30−ttcVersion = 19
30+ttcVersion = 20
3131
3232 export
3333 checkTTCVersion : String -> Int -> Int -> Core ()
src/Core/Context.idr+28−6
@@ -36,6 +36,16 @@ export · 35 unmodified lines
3636 defaultPI : PMDefInfo
3737 defaultPI = MkPMDefInfo NotHole False
3838
39+public export
40+record TypeFlags where
41+ constructor MkTypeFlags
42+ uniqueAuto : Bool -- should 'auto' implicits check for uniqueness
43+ external : Bool -- defined externally (e.g. in a C or Scheme library)
44+
45+export
46+defaultFlags : TypeFlags
47+defaultFlags = MkTypeFlags False False
48+
3949 public export
4050 data Def : Type where
4151 None : Def -- Not yet defined
@@ -61,8 +71,7 @@ data Def : Type where · 19 unmodified lines
6171 TCon : (tag : Int) -> (arity : Nat) ->
6272 (parampos : List Nat) -> -- parameters
6373 (detpos : List Nat) -> -- determining arguments
64− (uniqueAuto : Bool) -> -- should 'auto' implicits check
65− -- for uniqueness
74+ (flags : TypeFlags) -> -- should 'auto' implicits check
6675 (mutwith : List Name) ->
6776 (datacons : List Name) ->
6877 (detagabbleBy : Maybe (List Nat)) ->
@@ -1286,7 +1295,7 @@ getSearchData fc defaults target · 1217 unmodified lines
12861295 pure (MkSearchData dets (filter (isCons . snd)
12871296 [(False, opens),
12881297 (False, autos),
1289− (not u, tyhs),
1298+ (not (uniqueAuto u), tyhs),
12901299 (True, chasers)]))
12911300 where
12921301 isDefault : (Name, Bool) -> Bool
@@ -1362,9 +1371,22 @@ setUniqueSearch fc tyn u · 69 unmodified lines
13621371 = do defs <- get Ctxt
13631372 Just g <- lookupCtxtExact tyn (gamma defs)
13641373 | _ => throw (UndefinedName fc tyn)
1365− let TCon t a ps ds _ cons ms det = definition g
1374+ let TCon t a ps ds fl cons ms det = definition g
1375+ | _ => throw (GenericMsg fc (show (fullname g) ++ " is not a type constructor [setDetermining]"))
1376+ let fl' = record { uniqueAuto = u } fl
1377+ updateDef tyn (const (Just (TCon t a ps ds fl' cons ms det)))
1378+
1379+export
1380+setExternal : {auto c : Ref Ctxt Defs} ->
1381+ FC -> Name -> Bool -> Core ()
1382+setExternal fc tyn u
1383+ = do defs <- get Ctxt
1384+ Just g <- lookupCtxtExact tyn (gamma defs)
1385+ | _ => throw (UndefinedName fc tyn)
1386+ let TCon t a ps ds fl cons ms det = definition g
13661387 | _ => throw (GenericMsg fc (show (fullname g) ++ " is not a type constructor [setDetermining]"))
1367− updateDef tyn (const (Just (TCon t a ps ds u cons ms det)))
1388+ let fl' = record { external = u } fl
1389+ updateDef tyn (const (Just (TCon t a ps ds fl' cons ms det)))
13681390
13691391 export
13701392 addHintFor : {auto c : Ref Ctxt Defs} ->
@@ -1598,7 +1620,7 @@ addData vars vis tidx (MkData (MkCon dfc tyn arity tycon) datacons) · 227 unmodified lines
15981620 (TCon tag arity
15991621 (paramPos (Resolved tidx) (map type datacons))
16001622 (allDet arity)
1601− False [] (map name datacons) Nothing)
1623+ defaultFlags [] (map name datacons) Nothing)
16021624 (idx, gam') <- addCtxt tyn tydef (gamma defs)
16031625 gam'' <- addDataConstructors 0 datacons gam'
16041626 put Ctxt (record { gamma = gam'' } defs)
src/Core/Coverage.idr+4−2
@@ -51,8 +51,10 @@ export · 50 unmodified lines
5151 isEmpty : Defs -> NF vars -> Core Bool
5252 isEmpty defs (NTCon fc n t a args)
5353 = case !(lookupDefExact n (gamma defs)) of
54− Just (TCon _ _ _ _ _ _ cons _)
55− => allM (conflict defs (NTCon fc n t a args)) cons
54+ Just (TCon _ _ _ _ flags _ cons _)
55+ => if not (external flags)
56+ then allM (conflict defs (NTCon fc n t a args)) cons
57+ else pure False
5658 _ => pure False
5759 isEmpty defs _ = pure False
5860
src/Core/TTC.idr+10−0
@@ -777,6 +777,16 @@ TTC PMDefInfo where · 776 unmodified lines
777777 r <- fromBuf b
778778 pure (MkPMDefInfo h r)
779779
780+export
781+TTC TypeFlags where
782+ toBuf b l
783+ = do toBuf b (uniqueAuto l)
784+ toBuf b (external l)
785+ fromBuf b
786+ = do u <- fromBuf b
787+ e <- fromBuf b
788+ pure (MkTypeFlags u e)
789+
780790 export
781791 TTC Def where
782792 toBuf b None = tag 0
src/Idris/Parser.idr+2−0
@@ -894,6 +894,8 @@ dataOpt · 893 unmodified lines
894894 <|> do exactIdent "search"
895895 ns <- some name
896896 pure (SearchBy ns)
897+ <|> do exactIdent "external"
898+ pure External
897899
898900 dataBody : FileName -> Int -> FilePos -> Name -> IndentInfo -> PTerm ->
899901 EmptyRule PDataDecl
src/TTImp/ProcessData.idr+4−2
@@ -27,6 +27,8 @@ processDataOpt fc ndef (SearchBy dets) · 26 unmodified lines
2727 = setDetermining fc ndef dets
2828 processDataOpt fc ndef UniqueSearch
2929 = setUniqueSearch fc ndef True
30+processDataOpt fc ndef External
31+ = setExternal fc ndef True
3032
3133 checkRetType : {auto c : Ref Ctxt Defs} ->
3234 Env Term vars -> NF vars ->
@@ -253,7 +255,7 @@ processData {vars} eopts nest env fc vis (MkImpLater dfc n_in ty_raw) · 220 unmodified lines
253255
254256 -- Add the type constructor as a placeholder
255257 tidx <- addDef n (newDef fc n Rig1 vars fullty vis
256− (TCon 0 arity [] [] False [] [] Nothing))
258+ (TCon 0 arity [] [] defaultFlags [] [] Nothing))
257259 addMutData (Resolved tidx)
258260 defs <- get Ctxt
259261 traverse_ (\n => setMutWith fc n (mutData defs)) (mutData defs)
@@ -306,7 +308,7 @@ processData {vars} eopts nest env fc vis (MkImpData dfc n_in ty_raw opts cons_ra · 46 unmodified lines
306308 -- Add the type constructor as a placeholder while checking
307309 -- data constructors
308310 tidx <- addDef n (newDef fc n Rig1 vars fullty vis
309− (TCon 0 arity [] [] False [] [] Nothing))
311+ (TCon 0 arity [] [] defaultFlags [] [] Nothing))
310312 case vis of
311313 Private => pure ()
312314 _ => do addHash n
src/TTImp/TTImp.idr+4−0
@@ -231,12 +231,14 @@ mutual · 230 unmodified lines
231231 SearchBy : List Name -> DataOpt -- determining arguments
232232 NoHints : DataOpt -- Don't generate search hints for constructors
233233 UniqueSearch : DataOpt -- auto implicit search must check result is unique
234+ External : DataOpt -- implemented externally
234235
235236 export
236237 Eq DataOpt where
237238 (==) (SearchBy xs) (SearchBy ys) = xs == ys
238239 (==) NoHints NoHints = True
239240 (==) UniqueSearch UniqueSearch = True
241+ (==) External External = True
240242 (==) _ _ = False
241243
242244 public export
@@ -812,6 +814,7 @@ mutual · 569 unmodified lines
812814 = do tag 0; toBuf b ns
813815 toBuf b NoHints = tag 1
814816 toBuf b UniqueSearch = tag 2
817+ toBuf b External = tag 3
815818
816819 fromBuf b
817820 = case !getTag of
@@ -819,6 +822,7 @@ mutual · 1 unmodified line
819822 pure (SearchBy ns)
820823 1 => pure NoHints
821824 2 => pure UniqueSearch
825+ 3 => pure External
822826 _ => corrupt "DataOpt"
823827
824828 export
tests/Main.idr+1−0
@@ -81,6 +81,7 @@ idrisTests · 80 unmodified lines
8181 -- Miscellaneous regressions
8282 "reg001", "reg002", "reg003", "reg004", "reg005", "reg006", "reg007",
8383 "reg008", "reg009", "reg010", "reg011", "reg012", "reg013", "reg014",
84+ "reg015",
8485 -- Totality checking
8586 "total001", "total002", "total003", "total004", "total005",
8687 "total006",
tests/idris2/reg015/anyfail.idr+21−0
@@ -0,0 +1,21 @@
1+data SimpleData = PtrAndSize AnyPtr Int
2+
3+record Complicated where
4+ constructor MkComplicated
5+ simple : SimpleData
6+
7+record MoreComplicated where
8+ constructor MkMoreComplicated
9+ something : Complicated
10+
11+record EvenMoreComplicated where
12+ constructor MkEvenMoreComplicated
13+ somethingEven : MoreComplicated
14+
15+data TooComplicatedToBeTrue : (something : EvenMoreComplicated) -> Type where
16+ SomethingVeryComplicatedIs :
17+ TooComplicatedToBeTrue
18+ (MkEvenMoreComplicated (MkMoreComplicated (MkComplicated (PtrAndSize addr len))))
19+
20+showing : (something : EvenMoreComplicated) -> (TooComplicatedToBeTrue something) -> Void
21+showing _ SomethingVeryComplicatedIs impossible
tests/idris2/reg015/expected+2−0
@@ -0,0 +1,2 @@
1+1/1: Building anyfail (anyfail.idr)
2+anyfail.idr:21:1--22:1:showing (MkEvenMoreComplicated (MkMoreComplicated (MkComplicated (PtrAndSize addr len)))) SomethingVeryComplicatedIs is not a valid impossible case
tests/idris2/reg015/run+3−0
@@ -0,0 +1,3 @@
1+$1 anyfail.idr --check
2+
3+rm -rf build

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t