@@ -53,19 +53,32 @@ namesUsed sc = nub $ nu' [] sc where
5353 nut ps (Bind n b sc) = nut (n:ps) sc
5454 nut ps _ = []
5555
56−simpleCase :: Bool -> Bool -> [([Name], Term, Term)] -> CaseDef
57−simpleCase tc cover []
58− = CaseDef [] (UnmatchedCase "No pattern clauses") []
59−simpleCase tc cover cs
60− = let pats = map (\ (avs, l, r) -> (toPats tc l, (l, r))) cs
61− numargs = length (fst (head pats))
62− ns = take numargs args
63− (tree, st) = runState (match ns pats (defaultCase cover)) ([], numargs) in
64− CaseDef ns (prune tree) (fst st)
56+simpleCase :: Bool -> Bool -> FC -> [([Name], Term, Term)] -> TC CaseDef
57+simpleCase tc cover fc []
58+ = return $ CaseDef [] (UnmatchedCase "No pattern clauses") []
59+simpleCase tc cover fc cs
60+ = let pats = map (\ (avs, l, r) -> (avs, toPats tc l, (l, r))) cs
61+ chkPats = mapM chkAccessible pats in
62+ case chkPats of
63+ OK pats ->
64+ let numargs = length (fst (head pats))
65+ ns = take numargs args
66+ (tree, st) = runState
67+ (match ns pats (defaultCase cover)) ([], numargs) in
68+ return $ CaseDef ns (prune tree) (fst st)
69+ Error err -> Error (At fc err)
6570 where args = map (\i -> MN i "e") [0..]
6671 defaultCase True = STerm Erased
6772 defaultCase False = UnmatchedCase "Error"
6873
74+ chkAccessible (avs, l, c) = do mapM_ (acc l) avs
75+ return (l, c)
76+
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
81+
6982data Pat = PCon Name Int [Pat]
7083 | PConst Const
7184 | PV Name