@@ -53,19 +53,32 @@ namesUsed sc = nub $ nu' [] sc where
53 nut ps (Bind n b sc) = nut (n:ps) sc
53 nut ps (Bind n b sc) = nut (n:ps) sc
54 nut ps _ = []
54 nut ps _ = []
56−simpleCase :: Bool -> Bool -> [([Name], Term, Term)] -> CaseDef
56+simpleCase :: Bool -> Bool -> FC -> [([Name], Term, Term)] -> TC CaseDef
57−simpleCase tc cover []
57+simpleCase tc cover fc []
58− = CaseDef [] (UnmatchedCase "No pattern clauses") []
58+ = return $ CaseDef [] (UnmatchedCase "No pattern clauses") []
59−simpleCase tc cover cs
59+simpleCase tc cover fc cs
60− = let pats = map (\ (avs, l, r) -> (toPats tc l, (l, r))) cs
60+ = let pats = map (\ (avs, l, r) -> (avs, toPats tc l, (l, r))) cs
61+ chkPats = mapM chkAccessible pats in
61− numargs = length (fst (head pats))
64+ let numargs = length (fst (head pats))
62− ns = take numargs args
65+ ns = take numargs args
66+ (tree, st) = runState
63− (tree, st) = runState (match ns pats (defaultCase cover)) ([], numargs) in
67+ (match ns pats (defaultCase cover)) ([], numargs) in
64− CaseDef ns (prune tree) (fst st)
68+ return $ CaseDef ns (prune tree) (fst st)
69+ Error err -> Error (At fc err)
65 where args = map (\i -> MN i "e") [0..]
70 where args = map (\i -> MN i "e") [0..]
66 defaultCase True = STerm Erased
71 defaultCase True = STerm Erased
67 defaultCase False = UnmatchedCase "Error"
72 defaultCase False = UnmatchedCase "Error"
74+ chkAccessible (avs, l, c) = do mapM_ (acc l) avs
77+ acc [] n = Error (Inaccessible n)
78+ acc (PV x : xs) n | x == n = OK ()
79+ acc (PCon _ _ ps : xs) n = acc (ps ++ xs) n
80+ acc (_ : xs) n = acc xs n
69data Pat = PCon Name Int [Pat]
82data Pat = PCon Name Int [Pat]
70 | PConst Const
83 | PConst Const