[project @ 2002-09-09 12:50:26 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcPat.lhs
index e4decd0..291d854 100644 (file)
@@ -17,7 +17,8 @@ import TcHsSyn                ( TcPat, TcId, simpleHsLitTy )
 import TcMonad
 import Inst            ( InstOrigin(..),
                          emptyLIE, plusLIE, LIE, mkLIE, unitLIE, instToId, isEmptyLIE,
-                         newMethod, newMethodFromName, newOverloadedLit, newDicts, tcInstDataCon
+                         newMethod, newMethodFromName, newOverloadedLit, newDicts,
+                         tcInstDataCon, tcSyntaxName
                        )
 import Id              ( mkLocalId, mkSysLocal )
 import Name            ( Name )
@@ -35,7 +36,7 @@ import TcMonoType     ( tcHsSigType, UserTypeCtxt(..) )
 import TysWiredIn      ( stringTy )
 import CmdLineOpts     ( opt_IrrefutableTuples )
 import DataCon         ( dataConFieldLabels, dataConSourceArity )
-import PrelNames       ( eqStringName, eqName, geName, cCallableClassName )
+import PrelNames       ( eqStringName, eqName, geName, negateName, minusName, cCallableClassName )
 import BasicTypes      ( isBoxed )
 import Bag
 import Outputable
@@ -313,9 +314,8 @@ tcPat tc_bndr pat@(NPatIn over_lit mb_neg) pat_ty
        Nothing  -> returnNF_Tc (pos_lit_expr, emptyLIE)        -- Positive literal
        Just neg ->     -- Negative literal
                        -- The 'negate' is re-mappable syntax
-                   tcLookupId neg                              `thenNF_Tc` \ neg_sel_id ->
-                   newMethod origin neg_sel_id [pat_ty]        `thenNF_Tc` \ neg ->
-                   returnNF_Tc (HsApp (HsVar (instToId neg)) pos_lit_expr, unitLIE neg)
+                   tcSyntaxName origin pat_ty negateName neg   `thenTc` \ (neg_expr, neg_lie, _) ->
+                   returnNF_Tc (HsApp neg_expr pos_lit_expr, neg_lie)
     )                                                          `thenNF_Tc` \ (lit_expr, lie2) ->
 
     returnTc (NPat lit' pat_ty (HsApp (HsVar (instToId eq)) lit_expr),
@@ -323,9 +323,15 @@ tcPat tc_bndr pat@(NPatIn over_lit mb_neg) pat_ty
              emptyBag, emptyBag, emptyLIE)
   where
     origin = PatOrigin pat
-    lit' = case over_lit of
-               HsIntegral i _   -> HsInteger i
-               HsFractional f _ -> HsRat f pat_ty
+
+       -- The literal in an NPatIn is always positive...
+       -- But in NPat, the literal is used to find identical patterns
+       --      so we must negate the literal when necessary!
+    lit' = case (over_lit, mb_neg) of
+            (HsIntegral i _, Nothing)   -> HsInteger i
+            (HsIntegral i _, Just _)    -> HsInteger (-i)
+            (HsFractional f _, Nothing) -> HsRat f pat_ty
+            (HsFractional f _, Just _)  -> HsRat (-f) pat_ty
 \end{code}
 
 %************************************************************************
@@ -341,13 +347,12 @@ tcPat tc_bndr pat@(NPlusKPatIn name lit@(HsIntegral i _) minus_name) pat_ty
     newMethodFromName origin pat_ty geName     `thenNF_Tc` \ ge ->
 
        -- The '-' part is re-mappable syntax
-    tcLookupId minus_name                      `thenNF_Tc` \ minus_sel_id ->
-    newMethod origin minus_sel_id [pat_ty]     `thenNF_Tc` \ minus ->
+    tcSyntaxName origin pat_ty minusName minus_name    `thenTc` \ (minus_expr, minus_lie, _) ->
 
     returnTc (NPlusKPat bndr_id i pat_ty
                        (SectionR (HsVar (instToId ge)) over_lit_expr)
-                       (SectionR (HsVar (instToId minus)) over_lit_expr),
-             lie1 `plusLIE` lie2 `plusLIE` mkLIE [ge,minus],
+                       (SectionR minus_expr over_lit_expr),
+             lie1 `plusLIE` lie2 `plusLIE` minus_lie `plusLIE` unitLIE ge,
              emptyBag, unitBag (name, bndr_id), emptyLIE)
   where
     origin = PatOrigin pat