#include "HsVersions.h"
module RnExpr (
- rnMatch, rnGRHSsAndBinds, rnPat
+ rnMatch, rnGRHSsAndBinds, rnPat,
+ checkPrecMatch
) where
import Ubiq
-import RnLoop -- break the RnPass4/RnExpr4/RnBinds4 loops
+import RnLoop -- break the RnPass/RnExpr/RnBinds loops
import HsSyn
import RdrHsSyn
import RnMonad
import ErrUtils ( addErrLoc )
-import Name ( isLocallyDefinedName, pprOp, Name, RdrName )
+import Name ( isLocallyDefinedName, pprSym, Name, RdrName )
import Pretty
import UniqFM ( lookupUFM )
import UniqSet ( emptyUniqSet, unitUniqSet,
rnPat neg@(NegPatIn pat)
= getSrcLocRn `thenRn` \ src_loc ->
- addErrIfRn (not (is_lit pat)) (negPatErr neg src_loc)
+ addErrIfRn (not (valid_neg_pat pat)) (negPatErr neg src_loc)
`thenRn_`
rnPat pat `thenRn` \ pat' ->
returnRn (NegPatIn pat')
where
- is_lit (LitPatIn _) = True
- is_lit _ = False
+ valid_neg_pat (LitPatIn (HsInt _)) = True
+ valid_neg_pat (LitPatIn (HsFrac _)) = True
+ valid_neg_pat _ = False
rnPat (ParPatIn pat)
= rnPat pat `thenRn` \ pat' ->
where
fv_set vname@(RnName n)
| isLocallyDefinedName n = unitUniqSet vname
- | otherwise = emptyUniqSet
+ fv_set _ = emptyUniqSet
rnExpr (HsLit lit)
= returnRn (HsLit lit, emptyUniqSet)
precParsePat pat = returnRn pat
-data INFIX = INFIXL | INFIXR | INFIXN
+data INFIX = INFIXL | INFIXR | INFIXN deriving Eq
lookupFixity :: RnName -> RnM_Fixes s (INFIX, Int)
lookupFixity op
\end{code}
\begin{code}
+checkPrecMatch :: Bool -> RnName -> RenamedMatch -> RnM_Fixes s ()
+
+checkPrecMatch False fn match
+ = returnRn ()
+checkPrecMatch True op (PatMatch p1 (PatMatch p2 (GRHSMatch _)))
+ = checkPrec op p1 False `thenRn_`
+ checkPrec op p2 True
+checkPrecMatch True op _
+ = panic "checkPrecMatch"
+
+checkPrec op (ConOpPatIn _ op1 _) right
+ = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
+ lookupFixity op1 `thenRn` \ (op1_fix, op1_prec) ->
+ getSrcLocRn `thenRn` \ src_loc ->
+ let
+ inf_ok = op1_prec > op_prec ||
+ (op1_prec == op_prec &&
+ (op1_fix == INFIXR && op_fix == INFIXR && right ||
+ op1_fix == INFIXL && op_fix == INFIXL && not right))
+
+ info = (op,op_fix,op_prec)
+ info1 = (op1,op1_fix,op1_prec)
+ (infol, infor) = if right then (info, info1) else (info1, info)
+ in
+ addErrIfRn (not inf_ok) (precParseErr infol infor src_loc)
+
+checkPrec op (NegPatIn _) right
+ = lookupFixity op `thenRn` \ (op_fix, op_prec) ->
+ getSrcLocRn `thenRn` \ src_loc ->
+ addErrIfRn (6 < op_prec) (precParseNegPatErr (op,op_fix,op_prec) src_loc)
+
+checkPrec op pat right
+ = returnRn ()
+\end{code}
+
+\begin{code}
negPatErr pat src_loc
= addErrLoc src_loc "prefix `-' not applied to literal in pattern" ( \sty ->
ppr sty pat)
ppBesides [ppStr "cannot mix ", pp_op sty op1, ppStr " and ", pp_op sty op2,
ppStr " in the same infix expression"])
-pp_op sty (op, fix, prec) = ppBesides [pprOp sty op, ppLparen, pp_fix fix, ppSP, ppInt prec, ppRparen]
+pp_op sty (op, fix, prec) = ppBesides [pprSym sty op, ppLparen, pp_fix fix, ppSP, ppInt prec, ppRparen]
pp_fix INFIXL = ppStr "infixl"
pp_fix INFIXR = ppStr "infixr"
pp_fix INFIXN = ppStr "infix"