[project @ 2004-08-16 09:53:47 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / Inst.lhs
index ad51a49..c8a50d0 100644 (file)
@@ -5,12 +5,11 @@
 
 \begin{code}
 module Inst ( 
-       LIE, emptyLIE, unitLIE, plusLIE, consLIE, 
-       plusLIEs, mkLIE, isEmptyLIE, lieToList, listToLIE,
-       showLIE,
-
        Inst, 
-       pprInst, pprInsts, pprInstsInFull, pprDFuns,
+
+       pprDFuns, pprDictsTheta, pprDictsInFull,        -- User error messages
+       showLIE, pprInst, pprInsts, pprInstInFull,      -- Debugging messages
+
        tidyInsts, tidyMoreInsts,
 
        newDictsFromOld, newDicts, cloneDict, 
@@ -40,10 +39,11 @@ module Inst (
 #include "HsVersions.h"
 
 import {-# SOURCE #-}  TcExpr( tcCheckSigma )
+import {-# SOURCE #-}  TcUnify ( unifyTauTy )  -- Used in checkKind (sigh)
 
-import HsSyn   ( HsLit(..), HsOverLit(..), HsExpr(..) )
-import TcHsSyn ( TcExpr, TcId, TcIdSet, 
-                 mkHsTyApp, mkHsDictApp, mkHsConApp, zonkId,
+import HsSyn   ( HsLit(..), HsOverLit(..), HsExpr(..), LHsExpr, mkHsApp )
+import TcHsSyn ( TcId, TcIdSet, 
+                 mkHsTyApp, mkHsDictApp, mkHsConApp, zonkId, 
                  mkCoercion, ExprCoFn
                )
 import TcRnMonad
@@ -54,7 +54,7 @@ import TcMType        ( zonkTcType, zonkTcTypes, zonkTcPredType,
                  zonkTcThetaType, tcInstTyVar, tcInstType, tcInstTyVars
                )
 import TcType  ( Type, TcType, TcThetaType, TcTyVarSet,
-                 PredType(..), TyVarDetails(VanillaTv),
+                 PredType(..), TyVarDetails(VanillaTv), typeKind,
                  tcSplitForAllTys, tcSplitForAllTys, mkTyConApp,
                  tcSplitPhiTy, tcIsTyVarTy, tcSplitDFunTy,
                  isIntTy,isFloatTy, isIntegerTy, isDoubleTy,
@@ -63,8 +63,10 @@ import TcType        ( Type, TcType, TcThetaType, TcTyVarSet,
                  isClassPred, isTyVarClassPred, isLinearPred, 
                  getClassPredTys, getClassPredTys_maybe, mkPredName,
                  isInheritablePred, isIPPred, matchTys,
-                 tidyType, tidyTypes, tidyFreeTyVars, tcSplitSigmaTy
+                 tidyType, tidyTypes, tidyFreeTyVars, tcSplitSigmaTy, 
+                 pprPred, pprParendType, pprThetaArrow, pprTheta, pprClassPred
                )
+import Kind    ( isSubKind )
 import HscTypes        ( ExternalPackageState(..) )
 import CoreFVs ( idFreeTyVars )
 import DataCon ( DataCon,dataConSig )
@@ -72,17 +74,17 @@ import Id   ( Id, idName, idType, mkUserLocal, mkSysLocal, mkLocalId, setIdUnique
 import PrelInfo        ( isStandardClass, isNoDictClass )
 import Name    ( Name, mkMethodOcc, getOccName, getSrcLoc, isHomePackageName, isInternalName )
 import NameSet ( addOneToNameSet )
-import PprType ( pprPred, pprParendType, pprThetaArrow, pprClassPred ) 
-import Subst   ( substTy, substTyWith, substTheta, mkTyVarSubst )
+import Subst   ( substTy, substTyWith, substTheta, mkTopTyVarSubst )
 import Literal ( inIntRange )
-import Var     ( TyVar )
+import Var     ( TyVar, tyVarKind )
 import VarEnv  ( TidyEnv, emptyTidyEnv, lookupSubstEnv, SubstResult(..) )
 import VarSet  ( elemVarSet, emptyVarSet, unionVarSet, mkVarSet )
 import TysWiredIn ( floatDataCon, doubleDataCon )
 import PrelNames       ( integerTyConName, fromIntegerName, fromRationalName, rationalTyConName )
 import BasicTypes( IPName(..), mapIPName, ipNameName )
 import UniqSupply( uniqsFromSupply )
-import CmdLineOpts( DynFlags )
+import SrcLoc  ( mkSrcSpan, noLoc, unLoc, Located(..) )
+import CmdLineOpts( DynFlags, DynFlag( Opt_AllowUndecidableInstances ), dopt )
 import Maybes  ( isJust )
 import Outputable
 \end{code}
@@ -245,11 +247,12 @@ newDictsAtLoc inst_loc theta
 newIPDict :: InstOrigin -> IPName Name -> Type 
          -> TcM (IPName Id, Inst)
 newIPDict orig ip_name ty
-  = getInstLoc orig                    `thenM` \ inst_loc@(InstLoc _ loc _) ->
+  = getInstLoc orig                    `thenM` \ inst_loc ->
     newUnique                          `thenM` \ uniq ->
     let
        pred = IParam ip_name ty
-       id   = mkLocalId (mkPredName uniq loc pred) (mkPredTy pred)
+        name = mkPredName uniq (instLocSrcLoc inst_loc) pred 
+       id   = mkLocalId name (mkPredTy pred)
     in
     returnM (mapIPName (\n -> id) ip_name, Dict id pred inst_loc)
 \end{code}
@@ -270,31 +273,38 @@ tcInstCall orig fun_ty    -- fun_ty is usually a sigma-type
     newDicts orig theta                `thenM` \ dicts ->
     extendLIEs dicts           `thenM_`
     let
-       inst_fn e = mkHsDictApp (mkHsTyApp e (mkTyVarTys tyvars)) (map instToId dicts)
+       inst_fn e = DictApp (mkHsTyApp (noLoc e) (mkTyVarTys tyvars)) (map instToId dicts)
     in
     returnM (mkCoercion inst_fn, tau)
 
-tcInstDataCon :: InstOrigin -> DataCon
+tcInstDataCon :: InstOrigin
+             -> TyVarDetails   -- Use this for the existential tyvars
+                               -- ExistTv when pattern-matching, 
+                               -- VanillaTv at a call of the constructor
+             -> DataCon
              -> TcM ([TcType], -- Types to instantiate at
                      [Inst],   -- Existential dictionaries to apply to
                      [TcType], -- Argument types of constructor
                      TcType,   -- Result type
                      [TyVar])  -- Existential tyvars
-tcInstDataCon orig data_con
+tcInstDataCon orig ex_tv_details data_con
   = let 
        (tvs, stupid_theta, ex_tvs, ex_theta, arg_tys, tycon) = dataConSig data_con
             -- We generate constraints for the stupid theta even when 
             -- pattern matching (as the Report requires)
     in
-    tcInstTyVars VanillaTv (tvs ++ ex_tvs)     `thenM` \ (all_tvs', ty_args', tenv) ->
+    mappM (tcInstTyVar VanillaTv)     tvs      `thenM` \ tvs' ->
+    mappM (tcInstTyVar ex_tv_details) ex_tvs   `thenM` \ ex_tvs' ->
     let
+       tv_tys'    = mkTyVarTys tvs'
+       ex_tv_tys' = mkTyVarTys ex_tvs'
+       all_tys'   = tv_tys' ++ ex_tv_tys'
+
+       tenv          = mkTopTyVarSubst (tvs ++ ex_tvs) all_tys'
        stupid_theta' = substTheta tenv stupid_theta
        ex_theta'     = substTheta tenv ex_theta
        arg_tys'      = map (substTy tenv) arg_tys
-
-       n_normal_tvs  = length tvs
-       ex_tvs'       = drop n_normal_tvs all_tvs'
-       result_ty     = mkTyConApp tycon (take n_normal_tvs ty_args')
+       result_ty'    = mkTyConApp tycon tv_tys'
     in
     newDicts orig stupid_theta'        `thenM` \ stupid_dicts ->
     newDicts orig ex_theta'    `thenM` \ ex_dicts ->
@@ -303,7 +313,7 @@ tcInstDataCon orig data_con
        -- we don't otherwise use it at all
     extendLIEs stupid_dicts    `thenM_`
 
-    returnM (ty_args', ex_dicts, arg_tys', result_ty, ex_tvs')
+    returnM (all_tys', ex_dicts, arg_tys', result_ty', ex_tvs')
 
 newMethodFromName :: InstOrigin -> TcType -> Name -> TcM TcId
 newMethodFromName origin ty name
@@ -329,6 +339,11 @@ newMethodWithGivenTy orig id tys theta tau
 -- This is important because they are used by TcSimplify
 -- to simplify Insts
 
+-- NB: the kind of the type variable to be instantiated
+--     might be a sub-kind of the type to which it is applied,
+--     notably when the latter is a type variable of kind ??
+--     Hence the call to checkKind
+-- A worry: is this needed anywhere else?
 tcInstClassOp :: InstLoc -> Id -> [TcType] -> TcM Inst
 tcInstClassOp inst_loc sel_id tys
   = let
@@ -337,8 +352,21 @@ tcInstClassOp inst_loc sel_id tys
                       substTyWith tyvars tys rho
        (preds,tau)  = tcSplitPhiTy rho_ty
     in
+    zipWithM_ checkKind tyvars tys     `thenM_` 
     newMethod inst_loc sel_id tys preds tau
 
+checkKind :: TyVar -> TcType -> TcM ()
+-- Ensure that the type has a sub-kind of the tyvar
+checkKind tv ty
+  = do { ty1 <- zonkTcType ty
+       ; if typeKind ty1 `isSubKind` tyVarKind tv
+         then return ()
+         else do
+       { traceTc (text "checkKind: adding kind constraint" <+> ppr tv <+> ppr ty)
+       ; tv1 <- tcInstTyVar VanillaTv tv
+       ; unifyTauTy (mkTyVarTy tv1) ty1 }}
+
+
 ---------------------------
 newMethod inst_loc id tys theta tau
   = newUnique          `thenM` \ new_uniq ->
@@ -359,15 +387,16 @@ cases (the rest are caught in lookupInst).
 newOverloadedLit :: InstOrigin
                 -> HsOverLit
                 -> TcType
-                -> TcM TcExpr
+                -> TcM (LHsExpr TcId)
 newOverloadedLit orig lit@(HsIntegral i fi) expected_ty
-  | fi /= fromIntegerName      -- Do not generate a LitInst for rebindable
-                               -- syntax.  Reason: tcSyntaxName does unification
+  | fi /= fromIntegerName      -- Do not generate a LitInst for rebindable syntax.  
+                               -- Reason: tcSyntaxName does unification
                                -- which is very inconvenient in tcSimplify
+                               -- ToDo: noLoc sadness
   = tcSyntaxName orig expected_ty (fromIntegerName, HsVar fi)  `thenM` \ (_,expr) ->
     mkIntegerLit i                                             `thenM` \ integer_lit ->
-    returnM (HsApp expr integer_lit)
-
+    returnM (mkHsApp (noLoc expr) integer_lit)
+       -- The mkHsApp will get the loc from the literal
   | Just expr <- shortCutIntLit i expected_ty 
   = returnM expr
 
@@ -378,7 +407,8 @@ newOverloadedLit orig lit@(HsFractional r fr) expected_ty
   | fr /= fromRationalName     -- c.f. HsIntegral case
   = tcSyntaxName orig expected_ty (fromRationalName, HsVar fr) `thenM` \ (_,expr) ->
     mkRatLit r                                                 `thenM` \ rat_lit ->
-    returnM (HsApp expr rat_lit)
+    returnM (mkHsApp (noLoc expr) rat_lit)
+       -- The mkHsApp will get the loc from the literal
 
   | Just expr <- shortCutFracLit r expected_ty 
   = returnM expr
@@ -386,6 +416,7 @@ newOverloadedLit orig lit@(HsFractional r fr) expected_ty
   | otherwise
   = newLitInst orig lit expected_ty
 
+newLitInst :: InstOrigin -> HsOverLit -> TcType -> TcM (LHsExpr TcId)
 newLitInst orig lit expected_ty
   = getInstLoc orig            `thenM` \ loc ->
     newUnique                  `thenM` \ new_uniq ->
@@ -394,17 +425,17 @@ newLitInst orig lit expected_ty
        lit_id   = mkSysLocal FSLIT("lit") new_uniq expected_ty
     in
     extendLIE lit_inst         `thenM_`
-    returnM (HsVar (instToId lit_inst))
+    returnM (L (instLocSrcSpan loc) (HsVar (instToId lit_inst)))
 
-shortCutIntLit :: Integer -> TcType -> Maybe TcExpr
+shortCutIntLit :: Integer -> TcType -> Maybe (LHsExpr TcId)    -- Returns noLoc'd result :-)
 shortCutIntLit i ty
   | isIntTy ty && inIntRange i                 -- Short cut for Int
-  = Just (HsLit (HsInt i))
+  = Just (noLoc (HsLit (HsInt i)))
   | isIntegerTy ty                     -- Short cut for Integer
-  = Just (HsLit (HsInteger i ty))
+  = Just (noLoc (HsLit (HsInteger i ty)))
   | otherwise = Nothing
 
-shortCutFracLit :: Rational -> TcType -> Maybe TcExpr
+shortCutFracLit :: Rational -> TcType -> Maybe (LHsExpr TcId)  -- Returns noLoc'd result :-)
 shortCutFracLit f ty
   | isFloatTy ty 
   = Just (mkHsConApp floatDataCon [] [HsLit (HsFloatPrim f)])
@@ -412,15 +443,17 @@ shortCutFracLit f ty
   = Just (mkHsConApp doubleDataCon [] [HsLit (HsDoublePrim f)])
   | otherwise = Nothing
 
-mkIntegerLit :: Integer -> TcM TcExpr
+mkIntegerLit :: Integer -> TcM (LHsExpr TcId)
 mkIntegerLit i
   = tcMetaTy integerTyConName  `thenM` \ integer_ty ->
-    returnM (HsLit (HsInteger i integer_ty))
+    getSrcSpanM                        `thenM` \ span -> 
+    returnM (L span $ HsLit (HsInteger i integer_ty))
 
-mkRatLit :: Rational -> TcM TcExpr
+mkRatLit :: Rational -> TcM (LHsExpr TcId)
 mkRatLit r
   = tcMetaTy rationalTyConName         `thenM` \ rat_ty ->
-    returnM (HsLit (HsRat r rat_ty))
+    getSrcSpanM                        `thenM` \ span -> 
+    returnM (L span $ HsLit (HsRat r rat_ty))
 \end{code}
 
 
@@ -472,27 +505,33 @@ relevant in error messages.
 instance Outputable Inst where
     ppr inst = pprInst inst
 
-pprInsts :: [Inst] -> SDoc
-pprInsts insts  = parens (sep (punctuate comma (map pprInst insts)))
+pprDictsTheta :: [Inst] -> SDoc
+-- Print in type-like fashion (Eq a, Show b)
+pprDictsTheta dicts = pprTheta (map dictPred dicts)
 
-pprInstsInFull insts
-  = vcat (map go insts)
+pprDictsInFull :: [Inst] -> SDoc
+-- Print in type-like fashion, but with source location
+pprDictsInFull dicts 
+  = vcat (map go dicts)
   where
-    go inst = sep [quotes (ppr inst), nest 2 (pprInstLoc (instLoc inst))]
+    go dict = sep [quotes (ppr (dictPred dict)), nest 2 (pprInstLoc (instLoc dict))]
 
-pprInst (LitInst u lit ty loc)
-  = hsep [ppr lit, ptext SLIT("at"), ppr ty, show_uniq u]
+pprInsts :: [Inst] -> SDoc
+-- Debugging: print the evidence :: type
+pprInsts insts  = brackets (interpp'SP insts)
 
-pprInst (Dict u pred loc) = pprPred pred <+> show_uniq u
+pprInst, pprInstInFull :: Inst -> SDoc
+-- Debugging: print the evidence :: type
+pprInst (LitInst id lit ty loc) = ppr id <+> dcolon <+> ppr ty
+pprInst (Dict id pred loc)      = ppr id <+> dcolon <+> pprPred pred
 
-pprInst m@(Method u id tys theta tau loc)
-  = hsep [ppr id, ptext SLIT("at"), 
-         brackets (sep (map pprParendType tys)) {- ,
-         ptext SLIT("theta"), ppr theta,
-         ptext SLIT("tau"), ppr tau
-         show_uniq u,
-         ppr (instToId m) -}]
+pprInst m@(Method inst_id id tys theta tau loc)
+  = ppr inst_id <+> dcolon <+> 
+       braces (sep [ppr id <+> ptext SLIT("at"),
+                    brackets (sep (map pprParendType tys))])
 
+pprInstInFull inst
+  = sep [quotes (pprInst inst), nest 2 (pprInstLoc (instLoc inst))]
 
 pprDFuns :: [DFunId] -> SDoc
 -- Prints the dfun as an instance declaration
@@ -525,7 +564,7 @@ showLIE :: SDoc -> TcM ()   -- Debugging
 showLIE str
   = do { lie_var <- getLIEVar ;
         lie <- readMutVar lie_var ;
-        traceTc (str <+> pprInstsInFull (lieToList lie)) }
+        traceTc (str <+> vcat (map pprInstInFull (lieToList lie))) }
 \end{code}
 
 
@@ -581,13 +620,18 @@ traceDFuns dfuns
     pp dfun = ppr dfun <+> dcolon <+> ppr (idType dfun)
 
 funDepErr dfun dfuns
-  = addSrcLoc (getSrcLoc dfun) $
+  = addDictLoc dfun $
     addErr (hang (ptext SLIT("Functional dependencies conflict between instance declarations:"))
               2 (pprDFuns (dfun:dfuns)))
 dupInstErr dfun dup_dfun
-  = addSrcLoc (getSrcLoc dfun) $
+  = addDictLoc dfun $
     addErr (hang (ptext SLIT("Duplicate instance declarations:"))
               2 (pprDFuns [dfun, dup_dfun]))
+
+addDictLoc dfun thing_inside
+  = addSrcSpan (mkSrcSpan loc loc) thing_inside
+  where
+   loc = getSrcLoc dfun
 \end{code}
 
 %************************************************************************
@@ -599,8 +643,8 @@ dupInstErr dfun dup_dfun
 \begin{code}
 data LookupInstResult s
   = NoInstance
-  | SimpleInst TcExpr          -- Just a variable, type application, or literal
-  | GenInst    [Inst] TcExpr   -- The expression and its needed insts
+  | SimpleInst (LHsExpr TcId)          -- Just a variable, type application, or literal
+  | GenInst    [Inst] (LHsExpr TcId)   -- The expression and its needed insts
 
 lookupInst :: Inst -> TcM (LookupInstResult s)
 -- It's important that lookupInst does not put any new stuff into
@@ -612,7 +656,9 @@ lookupInst :: Inst -> TcM (LookupInstResult s)
 
 lookupInst inst@(Method _ id tys theta _ loc)
   = newDictsAtLoc loc theta            `thenM` \ dicts ->
-    returnM (GenInst dicts (mkHsDictApp (mkHsTyApp (HsVar id) tys) (map instToId dicts)))
+    returnM (GenInst dicts (mkHsDictApp (mkHsTyApp (L span (HsVar id)) tys) (map instToId dicts)))
+  where
+    span = instLocSrcSpan loc
 
 -- Literals
 
@@ -633,7 +679,8 @@ lookupInst inst@(LitInst u (HsIntegral i from_integer_name) ty loc)
     tcInstClassOp loc from_integer [ty]                `thenM` \ method_inst ->
     mkIntegerLit i                             `thenM` \ integer_lit ->
     returnM (GenInst [method_inst]
-                    (HsApp (HsVar (instToId method_inst)) integer_lit))
+                    (mkHsApp (L (instLocSrcSpan loc)
+                                (HsVar (instToId method_inst))) integer_lit))
 
 lookupInst inst@(LitInst u (HsFractional f from_rat_name) ty loc)
   | Just expr <- shortCutFracLit f ty
@@ -644,24 +691,21 @@ lookupInst inst@(LitInst u (HsFractional f from_rat_name) ty loc)
     tcLookupId fromRationalName                        `thenM` \ from_rational ->
     tcInstClassOp loc from_rational [ty]       `thenM` \ method_inst ->
     mkRatLit f                                 `thenM` \ rat_lit ->
-    returnM (GenInst [method_inst] (HsApp (HsVar (instToId method_inst)) rat_lit))
+    returnM (GenInst [method_inst] (mkHsApp (L (instLocSrcSpan loc) 
+                                              (HsVar (instToId method_inst))) rat_lit))
 
 -- Dictionaries
 lookupInst dict@(Dict _ pred@(ClassP clas tys) loc)
-  | all tcIsTyVarTy tys         -- Common special case; no lookup
-                        -- NB: tcIsTyVarTy... don't look through newtypes!
-  = returnM NoInstance
-       
-  | otherwise
-  = do { pkg_ie  <- loadImportedInsts clas tys
+  = do { pkg_ie <- loadImportedInsts clas tys
                -- Suck in any instance decls that may be relevant
        ; tcg_env <- getGblEnv
        ; dflags  <- getDOpts
        ; case lookupInstEnv dflags (pkg_ie, tcg_inst_env tcg_env) clas tys of {
            ([(tenv, (_,_,dfun_id))], []) -> instantiate_dfun tenv dfun_id pred loc ;
            (matches, unifs)              -> do
-       { traceTc (text "lookupInst" <+> vcat [text "matches" <+> ppr matches,
-                                              text "unifs" <+> ppr unifs])
+       { traceTc (text "lookupInst fail" <+> vcat [text "dict" <+> ppr pred,
+                                                   text "matches" <+> ppr matches,
+                                                   text "unifs" <+> ppr unifs])
        ; return NoInstance } } }
                -- In the case of overlap (multiple matches) we report
                -- NoInstance here.  That has the effect of making the 
@@ -673,7 +717,10 @@ lookupInst (Dict _ _ _) = returnM NoInstance
 
 -----------------
 instantiate_dfun tenv dfun_id pred loc
-  =    -- Record that this dfun is needed
+  = traceTc (text "lookupInst success" <+> 
+               vcat [text "dict" <+> ppr pred, 
+                     text "witness" <+> ppr dfun_id <+> ppr (idType dfun_id) ]) `thenM_`
+       -- Record that this dfun is needed
     record_dfun_usage dfun_id          `thenM_`
 
        -- It's possible that not all the tyvars are in
@@ -693,9 +740,12 @@ instantiate_dfun tenv dfun_id pred loc
     in
     mappM mk_ty_arg tyvars     `thenM` \ ty_args ->
     let
-       dfun_rho   = substTy (mkTyVarSubst tyvars ty_args) rho
+       dfun_rho   = substTy (mkTopTyVarSubst tyvars ty_args) rho
+               -- Since the tyvars are freshly made,
+               -- they cannot possibly be captured by
+               -- any existing for-alls.  Hence mkTopTyVarSubst
        (theta, _) = tcSplitPhiTy dfun_rho
-       ty_app     = mkHsTyApp (HsVar dfun_id) ty_args
+       ty_app     = mkHsTyApp (L (instLocSrcSpan loc) (HsVar dfun_id)) ty_args
     in
     if null theta then
        returnM (SimpleInst ty_app)
@@ -716,10 +766,10 @@ record_dfun_usage dfun_id
     dfun_name = idName dfun_id
 
 tcGetInstEnvs :: TcM (InstEnv, InstEnv)
--- Gets both the home-pkg inst env (includes module being compiled)
--- and the external-package inst-env
+-- Gets both the external-package inst-env
+-- and the home-pkg inst env (includes module being compiled)
 tcGetInstEnvs = do { eps <- getEps; env <- getGblEnv;
-                    return (tcg_inst_env env, eps_inst_env eps) }
+                    return (eps_inst_env eps, tcg_inst_env env) }
 \end{code}
 
 
@@ -757,7 +807,7 @@ just use the expression inline.
 tcSyntaxName :: InstOrigin
             -> TcType                  -- Type to instantiate it at
             -> (Name, HsExpr Name)     -- (Standard name, user name)
-            -> TcM (Name, TcExpr)      -- (Standard name, suitable expression)
+            -> TcM (Name, HsExpr TcId) -- (Standard name, suitable expression)
 
 -- NB: tcSyntaxName calls tcExpr, and hence can do unification.
 -- So we do not call it from lookupInst, which is called from tcSimplify
@@ -771,21 +821,23 @@ tcSyntaxName orig ty (std_nm, user_nm_expr)
     let        
        -- C.f. newMethodAtLoc
        ([tv], _, tau)  = tcSplitSigmaTy (idType std_id)
-       tau1            = substTyWith [tv] [ty] tau
+       sigma1          = substTyWith [tv] [ty] tau
        -- Actually, the "tau-type" might be a sigma-type in the
        -- case of locally-polymorphic methods.
     in
-    addErrCtxtM (syntaxNameCtxt user_nm_expr orig tau1)        $
+    addErrCtxtM (syntaxNameCtxt user_nm_expr orig sigma1)      $
 
        -- Check that the user-supplied thing has the
-       -- same type as the standard one
-    tcCheckSigma user_nm_expr tau1                     `thenM` \ expr ->
-    returnM (std_nm, expr)
+       -- same type as the standard one.  
+       -- Tiresome jiggling because tcCheckSigma takes a located expression
+    getSrcSpanM                                        `thenM` \ span -> 
+    tcCheckSigma (L span user_nm_expr) sigma1  `thenM` \ expr ->
+    returnM (std_nm, unLoc expr)
 
 tcStdSyntaxName :: InstOrigin
-               -> TcType               -- Type to instantiate it at
-               -> Name                 -- Standard name
-               -> TcM (Name, TcExpr)   -- (Standard name, suitable expression)
+               -> TcType                       -- Type to instantiate it at
+               -> Name                         -- Standard name
+               -> TcM (Name, HsExpr TcId)      -- (Standard name, suitable expression)
 
 tcStdSyntaxName orig ty std_nm
   = newMethodFromName orig ty std_nm   `thenM` \ id ->