@@ -1205,7 +1205,7 @@ addUsingConstraints syn fc t
1205 | otherwise = doAdd cs ns t
1205 | otherwise = doAdd cs ns t
1207 mkConst c args = PApp fc (PRef fc c)
1207 mkConst c args = PApp fc (PRef fc c)
1208− (map (\n -> PExp 0 [] (sMN 0 "carg" (PRef fc n)) args)
1208+ (map (\n -> PExp 0 [] (sMN 0 "carg") (PRef fc n)) args)
1210 getConstraints (PPi (Constraint _ _) _ c sc)
1210 getConstraints (PPi (Constraint _ _) _ c sc)
1211 = getcapp c ++ getConstraints sc
1211 = getcapp c ++ getConstraints sc
@@ -1232,8 +1232,7 @@ implicit' :: ElabInfo -> SyntaxInfo -> [Name] -> Name -> PTerm -> Idris PTerm
1232implicit' info syn ignore n ptm
1232implicit' info syn ignore n ptm
1233 = do i <- getIState
1233 = do i <- getIState
1234 let (tm', impdata) = implicitise syn ignore i ptm
1234 let (tm', impdata) = implicitise syn ignore i ptm
1235− -- TODO WIP check impdata for unknown vars in default args
1236− defaultArgCheck (eInfoNames info ++ keys (idris_implicits i)) impdata
1235+ defaultArgCheck (eInfoNames info ++ M.keys (idris_implicits i)) impdata
1237-- let (tm'', spos) = findStatics i tm'
1236-- let (tm'', spos) = findStatics i tm'
1238 putIState $ i { idris_implicits = addDef n impdata (idris_implicits i) }
1237 putIState $ i { idris_implicits = addDef n impdata (idris_implicits i) }
1239 addIBC (IBCImp n)
1238 addIBC (IBCImp n)
@@ -1244,21 +1243,20 @@ implicit' info syn ignore n ptm
1245 -- Detect unknown names in default arguments and throw error if found.
1244 -- Detect unknown names in default arguments and throw error if found.
1246 defaultArgCheck :: [Name] -> [PArg] -> Idris ()
1245 defaultArgCheck :: [Name] -> [PArg] -> Idris ()
1247− defaultArgCheck names params = foldM_ names params unknownInDefault
1246+ defaultArgCheck knowns params = foldM_ notFoundInDefault knowns params
1249− unknownInDefault :: [Name] -> PArg -> Idris [Name]
1248+ notFoundInDefault :: [Name] -> PArg -> Idris [Name]
1250− unknownInDefault ns (PTacImplicit _ _ n script _)
1249+ notFoundInDefault kns (PTacImplicit _ _ n script _)
1250+ = do i <- getIState
1251− = case notFound (namesIn script) ns of
1251+ case notFound kns (namesIn [] i script) of
1252− Nothing -> return (n:ns)
1252+ Nothing -> return (n:kns)
1253− Just name -> throwError (NoSuchVariable name)
1253+ Just name -> throwError (NoSuchVariable name)
1254− -- TODO See if PConstraint in addition to PExp can reasonably have
1254+ notFoundInDefault kns p = return ((pname p):kns)
1255− -- a name. Until then, 'pname p' worksn't.
1255+
1256− unknownInDefault ns p = return (pname p):ns
1258− unknown :: [Name] -> [Name] -> Maybe Name
1256+ notFound :: [Name] -> [Name] -> Maybe Name
1259− unknown [] _ = Nothing
1257+ notFound kns [] = Nothing
1260− unknown (SN (WhereN _ _ _)):as bs = unknown as bs
1258+ notFound kns (SN (WhereN _ _ _) : ns) = notFound kns ns -- Known already
1261− unknown a:as bs = if elem a bs then unknown as bs else Just a
1259+ notFound kns (n:ns) = if elem n kns then notFound kns ns else Just n
1263implicitise :: SyntaxInfo -> [Name] -> IState -> PTerm -> (PTerm, [PArg])
1261implicitise :: SyntaxInfo -> [Name] -> IState -> PTerm -> (PTerm, [PArg])
1264implicitise syn ignore ist tm = -- trace ("INCOMING " ++ showImp True tm) $
1262implicitise syn ignore ist tm = -- trace ("INCOMING " ++ showImp True tm) $
@@ -1525,6 +1523,9 @@ aiFn inpat expat ist fc f ds as
1525 [(n,t)] -> t
1523 [(n,t)] -> t
1526 _ -> Public
1524 _ -> Public
1526+ insertImpl :: [PArg] -> [PArg] -> [PArg]
1527+ insertImpl ps as = insImpAcc M.empty ps as
1528 -- TODO WIP substitution into default arg expressions.
1529 -- TODO WIP substitution into default arg expressions.
1529 -- - An extra accumulator parameter here?
1530 -- - An extra accumulator parameter here?
1530 -- - Accumulator of what?
1531 -- - Accumulator of what?
@@ -1534,38 +1535,38 @@ aiFn inpat expat ist fc f ds as
1534 -- function?
1535 -- function?
1535 -- - Check for existing call sites of insertImpl.
1536 -- - Check for existing call sites of insertImpl.
1536 -- - Well, easy: this is in a where block :-).
1537 -- - Well, easy: this is in a where block :-).
1537− insertImpl :: M.Map Name PTerm -- accumulated param names & arg terms
1538+ insImpAcc :: M.Map Name PTerm -- accumulated param names & arg terms
1538− -> [PArg] -- parameters
1539+ -> [PArg] -- parameters
1539− -> [PArg] -- arguments
1540+ -> [PArg] -- arguments
1540− -> [PArg]
1541+ -> [PArg]
1541− insertImpl pnas (PExp p l n ty : ps) (PExp _ _ _ tm : given) =
1542+ insImpAcc pnas (PExp p l n ty : ps) (PExp _ _ _ tm : given) =
1542− PExp p l n tm : insertImpl (M.insert n tm pnas) ps given
1543+ PExp p l n tm : insImpAcc (M.insert n tm pnas) ps given
1543− insertImpl pnas (PConstraint p l n ty : ps) (PConstraint _ _ _ tm : given) =
1544+ insImpAcc pnas (PConstraint p l n ty : ps) (PConstraint _ _ _ tm : given) =
1544− PConstraint p l n tm : insertImpl (M.insert n tm pnas) ps given
1545+ PConstraint p l n tm : insImpAcc (M.insert n tm pnas) ps given
1545− insertImpl pnas (PConstraint p l n ty : ps) given =
1546+ insImpAcc pnas (PConstraint p l n ty : ps) given =
1546 let rtc = PResolveTC fc in
1547 let rtc = PResolveTC fc in
1547− PConstraint p l n rtc : insertImpl (M.insert n rtc pnas) ps given
1548+ PConstraint p l n rtc : insImpAcc (M.insert n rtc pnas) ps given
1548− insertImpl pnas (PImp p _ l n ty : ps) given =
1549+ insImpAcc pnas (PImp p _ l n ty : ps) given =
1549 case find n given [] of
1550 case find n given [] of
1550 Just (tm, given') ->
1551 Just (tm, given') ->
1551− PImp p False l n tm : insertImpl (M.insert n tm pnas) ps given'
1552+ PImp p False l n tm : insImpAcc (M.insert n tm pnas) ps given'
1552 Nothing ->
1553 Nothing ->
1553 PImp p True l n Placeholder :
1554 PImp p True l n Placeholder :
1554− insertImpl (M.insert n Placeholder pnas) ps given
1555+ insImpAcc (M.insert n Placeholder pnas) ps given
1555− insertImpl pnas (PTacImplicit p l n sc' ty : ps) given =
1556+ insImpAcc pnas (PTacImplicit p l n sc' ty : ps) given =
1556− let sc = addImpl ist (substMatches (toList pnas) sc') in
1557+ let sc = addImpl ist (substMatches (M.toList pnas) sc') in
1557 case find n given [] of
1558 case find n given [] of
1558 Just (tm, given') ->
1559 Just (tm, given') ->
1559 PTacImplicit p l n sc tm :
1560 PTacImplicit p l n sc tm :
1560− insertImpl (M.insert n tm pnas) ps given'
1561+ insImpAcc (M.insert n tm pnas) ps given'
1561 Nothing ->
1562 Nothing ->
1562 if inpat
1563 if inpat
1563 then PTacImplicit p l n sc Placeholder :
1564 then PTacImplicit p l n sc Placeholder :
1564− insertImpl (M.insert n Placeholder pnas) ps given
1565+ insImpAcc (M.insert n Placeholder pnas) ps given
1565 else PTacImplicit p l n sc sc :
1566 else PTacImplicit p l n sc sc :
1566− insertImpl (M.insert n sc pnas) ps given
1567+ insImpAcc (M.insert n sc pnas) ps given
1567− insertImpl expected [] = []
1568+ insImpAcc _ expected [] = []
1568− insertImpl _ given = given
1569+ insImpAcc _ _ given = given
1570 find n [] acc = Nothing
1571 find n [] acc = Nothing
1571 find n (PImp _ _ _ n' t : gs) acc
1572 find n (PImp _ _ _ n' t : gs) acc
@@ -1602,8 +1603,8 @@ stripLinear i tm = evalState (sl tm) [] where
1602 return $ PApp fc fn args'
1603 return $ PApp fc fn args'
1603 where slA (PImp p m l n t) = do t' <- sl t
1604 where slA (PImp p m l n t) = do t' <- sl t
1604 return $ PImp p m l n t'
1605 return $ PImp p m l n t'
1605− slA (PExp p l n t) = do t' <- sl t
1606+ slA (PExp p l n t) = do t' <- sl t
1606− return $ PExp p l n t'
1607+ return $ PExp p l n t'
1607 slA (PConstraint p l n t)
1608 slA (PConstraint p l n t)
1608 = do t' <- sl t
1609 = do t' <- sl t
1609 return $ PConstraint p l n t'
1610 return $ PConstraint p l n t'