[project @ 2000-11-14 10:46:39 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcBinds.lhs
index e323153..533058f 100644 (file)
@@ -4,61 +4,62 @@
 \section[TcBinds]{TcBinds}
 
 \begin{code}
-module TcBinds ( tcBindsAndThen, tcTopBindsAndThen,
-                tcPragmaSigs, tcBindWithSigs ) where
+module TcBinds ( tcBindsAndThen, tcTopBinds,
+                tcSpecSigs, tcBindWithSigs ) where
 
 #include "HsVersions.h"
 
-import {-# SOURCE #-} TcGRHSs ( tcGRHSsAndBinds )
+import {-# SOURCE #-} TcMatches ( tcGRHSs, tcMatchesFun )
 import {-# SOURCE #-} TcExpr  ( tcExpr )
 
-import HsSyn           ( HsExpr(..), HsBinds(..), MonoBinds(..), Sig(..), InPat(..), StmtCtxt(..),
-                         collectMonoBinders, andMonoBindList, andMonoBinds
+import HsSyn           ( HsExpr(..), HsBinds(..), MonoBinds(..), Sig(..), StmtCtxt(..),
+                         Match(..), collectMonoBinders, andMonoBinds
                        )
 import RnHsSyn         ( RenamedHsBinds, RenamedSig, RenamedMonoBinds )
-import TcHsSyn         ( TcHsBinds, TcMonoBinds,
-                         TcIdOcc(..), TcIdBndr, 
-                         tcIdType, zonkId
-                       )
+import TcHsSyn         ( TcMonoBinds, TcId, zonkId, mkHsLet )
 
 import TcMonad
-import Inst            ( Inst, LIE, emptyLIE, mkLIE, plusLIE, plusLIEs, InstOrigin(..),
+import Inst            ( LIE, emptyLIE, mkLIE, plusLIE, InstOrigin(..),
                          newDicts, tyVarsOfInst, instToId,
+                         getAllFunDepsOfLIE, getIPsOfLIE, zonkFunDeps
                        )
-import TcEnv           ( tcExtendLocalValEnv, tcExtendEnvWithPat, 
-                         tcLookupLocalValueOK,
-                         newSpecPragmaId,
+import TcEnv           ( tcExtendLocalValEnv,
+                         newSpecPragmaId, newLocalId,
+                         tcLookupTyCon, 
                          tcGetGlobalTyVars, tcExtendGlobalTyVars
                        )
-import TcMatches       ( tcMatchesFun )
-import TcSimplify      ( tcSimplify, tcSimplifyAndCheck )
-import TcMonoType      ( tcHsTcType, checkSigTyVars,
+import TcSimplify      ( tcSimplify, tcSimplifyAndCheck, tcSimplifyToDicts )
+import TcImprove       ( tcImprove )
+import TcMonoType      ( tcHsSigType, checkSigTyVars,
                          TcSigInfo(..), tcTySig, maybeSig, sigCtxt
                        )
-import TcPat           ( tcVarPat, tcPat )
+import TcPat           ( tcPat )
 import TcSimplify      ( bindInstsOfLocalFuns )
-import TcType          ( TcType, TcThetaType,
-                         TcTyVar,
-                         newTyVarTy, newTcTyVar, tcInstTcType,
-                         zonkTcType, zonkTcTypes, zonkTcThetaType )
+import TcType          ( TcThetaType, newTyVarTy, newTyVar, 
+                         zonkTcTypes, zonkTcThetaType, zonkTcTyVarToTyVar
+                       )
 import TcUnify         ( unifyTauTy, unifyTauTyLists )
 
-import Id              ( mkUserId )
-import Var             ( idType, idName, setIdInfo )
-import IdInfo          ( IdInfo, noIdInfo, setInlinePragInfo, InlinePragInfo(..) )
-import Name            ( Name )
-import Type            ( mkTyVarTy, tyVarsOfTypes,
-                         splitSigmaTy, mkForAllTys, mkFunTys, getTyVar, 
-                         mkDictTy, splitRhoTy, mkForAllTy, isUnLiftedType, 
-                         isUnboxedType, openTypeKind, 
-                         unboxedTypeKind, boxedTypeKind
+import CoreFVs         ( idFreeTyVars )
+import Id              ( mkVanillaId, setInlinePragma )
+import Var             ( idType, idName )
+import IdInfo          ( InlinePragInfo(..) )
+import Name            ( Name, getOccName, getSrcLoc )
+import NameSet
+import Type            ( mkTyVarTy, tyVarsOfTypes, mkTyConApp,
+                         mkForAllTys, mkFunTys, 
+                         mkPredTy, mkForAllTy, isUnLiftedType, 
+                         isUnboxedType, unboxedTypeKind, boxedTypeKind, openTypeKind
                        )
-import Var             ( TyVar, tyVarKind )
+import FunDeps         ( tyVarFunDep, oclose )
+import Var             ( tyVarKind )
 import VarSet
 import Bag
 import Util            ( isIn )
-import BasicTypes      ( TopLevelFlag(..), RecFlag(..) )
-import SrcLoc           ( SrcLoc )
+import Maybes          ( maybeToBool )
+import BasicTypes      ( TopLevelFlag(..), RecFlag(..), isNotTopLevel )
+import FiniteMap       ( listToFM, lookupFM )
+import PrelNames       ( ioTyConName, mainKey, hasKey )
 import Outputable
 \end{code}
 
@@ -95,14 +96,22 @@ At the top-level the LIE is sure to contain nothing but constant
 dictionaries, which we resolve at the module level.
 
 \begin{code}
-tcTopBindsAndThen, tcBindsAndThen
-       :: (RecFlag -> TcMonoBinds s -> thing -> thing)         -- Combinator
+tcTopBinds :: RenamedHsBinds -> TcM ((TcMonoBinds, TcEnv), LIE)
+tcTopBinds binds
+  = tc_binds_and_then TopLevel glue binds      $
+    tcGetEnv                                   `thenNF_Tc` \ env ->
+    returnTc ((EmptyMonoBinds, env), emptyLIE)
+  where
+    glue is_rec binds1 (binds2, thing) = (binds1 `AndMonoBinds` binds2, thing)
+
+
+tcBindsAndThen
+       :: (RecFlag -> TcMonoBinds -> thing -> thing)           -- Combinator
        -> RenamedHsBinds
-       -> TcM s (thing, LIE s)
-       -> TcM s (thing, LIE s)
+       -> TcM (thing, LIE)
+       -> TcM (thing, LIE)
 
-tcTopBindsAndThen = tc_binds_and_then TopLevel
-tcBindsAndThen    = tc_binds_and_then NotTopLevel
+tcBindsAndThen = tc_binds_and_then NotTopLevel
 
 tc_binds_and_then top_lvl combiner EmptyBinds do_next
   = do_next
@@ -115,22 +124,17 @@ tc_binds_and_then top_lvl combiner (ThenBinds b1 b2) do_next
     do_next
 
 tc_binds_and_then top_lvl combiner (MonoBind bind sigs is_rec) do_next
-  = fixTc (\ ~(prag_info_fn, _, _) ->
-       -- This is the usual prag_info fix; the PragmaInfo field of an Id
-       -- is not inspected till ages later in the compiler, so there
-       -- should be no black-hole problems here.
-
-       -- TYPECHECK THE SIGNATURES
+  =    -- TYPECHECK THE SIGNATURES
       mapTc tcTySig [sig | sig@(Sig name _ _) <- sigs] `thenTc` \ tc_ty_sigs ->
   
-      tcBindWithSigs top_lvl bind 
-                    tc_ty_sigs is_rec prag_info_fn     `thenTc` \ (poly_binds, poly_lie, poly_ids) ->
+      tcBindWithSigs top_lvl bind tc_ty_sigs
+                    sigs is_rec                        `thenTc` \ (poly_binds, poly_lie, poly_ids) ->
   
          -- Extend the environment to bind the new polymorphic Ids
-      tcExtendLocalValEnv (map idName poly_ids) poly_ids $
+      tcExtendLocalValEnv [(idName poly_id, poly_id) | poly_id <- poly_ids] $
   
          -- Build bindings and IdInfos corresponding to user pragmas
-      tcPragmaSigs sigs                `thenTc` \ (prag_info_fn, prag_binds, prag_lie) ->
+      tcSpecSigs sigs          `thenTc` \ (prag_binds, prag_lie) ->
 
        -- Now do whatever happens next, in the augmented envt
       do_next                  `thenTc` \ (thing, thing_lie) ->
@@ -144,8 +148,7 @@ tc_binds_and_then top_lvl combiner (MonoBind bind sigs is_rec) do_next
                -- All the top level things are rec'd together anyway, so it's fine to
                -- leave them to the tcSimplifyTop, and quite a bit faster too
        (TopLevel, _)
-               -> returnTc (prag_info_fn, 
-                            combiner Recursive (poly_binds `andMonoBinds` prag_binds) thing,
+               -> returnTc (combiner Recursive (poly_binds `andMonoBinds` prag_binds) thing,
                             thing_lie `plusLIE` prag_lie `plusLIE` poly_lie)
 
        (NotTopLevel, NonRecursive) 
@@ -154,7 +157,6 @@ tc_binds_and_then top_lvl combiner (MonoBind bind sigs is_rec) do_next
                                poly_ids                        `thenTc` \ (thing_lie', lie_binds) ->
 
                   returnTc (
-                       prag_info_fn,
                        combiner NonRecursive poly_binds $
                        combiner NonRecursive prag_binds $
                        combiner Recursive lie_binds  $
@@ -172,15 +174,12 @@ tc_binds_and_then top_lvl combiner (MonoBind bind sigs is_rec) do_next
                                poly_ids                        `thenTc` \ (final_lie, lie_binds) ->
 
                   returnTc (
-                       prag_info_fn,
                        combiner Recursive (
                                poly_binds `andMonoBinds`
                                lie_binds  `andMonoBinds`
                                prag_binds) thing,
                        final_lie
-                 )
-    )                                          `thenTc` \ (_, thing, lie) ->
-    returnTc (thing, lie)
+                  )
 \end{code}
 
 An aside.  The original version of @tcBindsAndThen@ which lacks a
@@ -192,8 +191,8 @@ examples of this, which is why I thought it worth preserving! [SLPJ]
 \begin{pseudocode}
 % tcBindsAndThen
 %      :: RenamedHsBinds
-%      -> TcM s (thing, LIE s, thing_ty))
-%      -> TcM s ((TcHsBinds s, thing), LIE s, thing_ty)
+%      -> TcM (thing, LIE, thing_ty))
+%      -> TcM ((TcHsBinds, thing), LIE, thing_ty)
 % 
 % tcBindsAndThen EmptyBinds do_next
 %   = do_next          `thenTc` \ (thing, lie, thing_ty) ->
@@ -230,48 +229,63 @@ so all the clever stuff is in here.
 tcBindWithSigs 
        :: TopLevelFlag
        -> RenamedMonoBinds
-       -> [TcSigInfo s]
+       -> [TcSigInfo]
+       -> [RenamedSig]         -- Used solely to get INLINE, NOINLINE sigs
        -> RecFlag
-       -> (Name -> IdInfo)
-       -> TcM s (TcMonoBinds s, LIE s, [TcIdBndr s])
+       -> TcM (TcMonoBinds, LIE, [TcId])
 
-tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
+tcBindWithSigs top_lvl mbind tc_ty_sigs inline_sigs is_rec
   = recoverTc (
        -- If typechecking the binds fails, then return with each
        -- signature-less binder given type (forall a.a), to minimise subsequent
        -- error messages
-       newTcTyVar boxedTypeKind                `thenNF_Tc` \ alpha_tv ->
+       newTyVar boxedTypeKind          `thenNF_Tc` \ alpha_tv ->
        let
          forall_a_a    = mkForAllTy alpha_tv (mkTyVarTy alpha_tv)
-          binder_names  = map fst (bagToList (collectMonoBinders mbind))
+          binder_names  = collectMonoBinders mbind
          poly_ids      = map mk_dummy binder_names
          mk_dummy name = case maybeSig tc_ty_sigs name of
                            Just (TySigInfo _ poly_id _ _ _ _ _ _) -> poly_id   -- Signature
-                           Nothing -> mkUserId name forall_a_a                 -- No signature
+                           Nothing -> mkVanillaId name forall_a_a              -- No signature
        in
        returnTc (EmptyMonoBinds, emptyLIE, poly_ids)
     ) $
 
        -- TYPECHECK THE BINDINGS
-    tcMonoBinds mbind tc_ty_sigs is_rec        `thenTc` \ (mbind', lie_req, binder_names, mono_ids) ->
-
-    let
-       mono_id_tys = map idType mono_ids
-    in
+    tcMonoBinds mbind tc_ty_sigs is_rec                `thenTc` \ (mbind', lie_req, binder_names, mono_ids) ->
 
        -- CHECK THAT THE SIGNATURES MATCH
        -- (must do this before getTyVarsToGen)
-    checkSigMatch tc_ty_sigs                           `thenTc` \ (sig_theta, lie_avail) ->    
+    checkSigMatch top_lvl binder_names mono_ids tc_ty_sigs     `thenTc` \ maybe_sig_theta ->   
+
+       -- IMPROVE the LIE
+       -- Force any unifications dictated by functional dependencies.
+       -- Because unification may happen, it's important that this step
+       -- come before:
+       --   - computing vars over which to quantify
+       --   - zonking the generalized type vars
+    let lie_avail = case maybe_sig_theta of
+                     Nothing      -> emptyLIE
+                     Just (_, la) -> la
+       lie_avail_req = lie_avail `plusLIE` lie_req in
+    tcImprove lie_avail_req                            `thenTc_`
 
        -- COMPUTE VARIABLES OVER WHICH TO QUANTIFY, namely tyvars_to_gen
        -- The tyvars_not_to_gen are free in the environment, and hence
        -- candidates for generalisation, but sometimes the monomorphism
        -- restriction means we can't generalise them nevertheless
+    let
+       mono_id_tys = map idType mono_ids
+    in
     getTyVarsToGen is_unrestricted mono_id_tys lie_req `thenNF_Tc` \ (tyvars_not_to_gen, tyvars_to_gen) ->
 
-       -- DEAL WITH TYPE VARIABLE KINDS
-       -- **** This step can do unification => keep other zonking after this ****
-    mapTc defaultUncommittedTyVar (varSetElems tyvars_to_gen)  `thenTc` \ real_tyvars_to_gen_list ->
+       -- Finally, zonk the generalised type variables to real TyVars
+       -- This commits any unbound kind variables to boxed kind
+       -- I'm a little worried that such a kind variable might be
+       -- free in the environment, but I don't think it's possible for
+       -- this to happen when the type variable is not free in the envt
+       -- (which it isn't).            SLPJ Nov 98
+    mapTc zonkTcTyVarToTyVar (varSetElems tyvars_to_gen)       `thenTc` \ real_tyvars_to_gen_list ->
     let
        real_tyvars_to_gen = mkVarSet real_tyvars_to_gen_list
                -- It's important that the final list 
@@ -285,19 +299,25 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
 
        -- SIMPLIFY THE LIE
     tcExtendGlobalTyVars tyvars_not_to_gen (
-       if null real_tyvars_to_gen_list then
-               -- No polymorphism, so no need to simplify context
+       let ips = getIPsOfLIE lie_avail_req in
+       if null real_tyvars_to_gen_list && (null ips || not is_unrestricted) then
+               -- No polymorphism, and no IPs, so no need to simplify context
            returnTc (lie_req, EmptyMonoBinds, [])
        else
-       if null tc_ty_sigs then
+       case maybe_sig_theta of
+         Nothing ->
                -- No signatures, so just simplify the lie
                -- NB: no signatures => no polymorphic recursion, so no
                -- need to use lie_avail (which will be empty anyway)
            tcSimplify (text "tcBinds1" <+> ppr binder_names)
-                      top_lvl real_tyvars_to_gen lie_req       `thenTc` \ (lie_free, dict_binds, lie_bound) ->
+                      real_tyvars_to_gen lie_req       `thenTc` \ (lie_free, dict_binds, lie_bound) ->
            returnTc (lie_free, dict_binds, map instToId (bagToList lie_bound))
 
-       else
+         Just (sig_theta, lie_avail) ->
+               -- There are signatures, and their context is sig_theta
+               -- Furthermore, lie_avail is an LIE containing the 'method insts'
+               -- for the things bound here
+
            zonkTcThetaType sig_theta                   `thenNF_Tc` \ sig_theta' ->
            newDicts SignatureOrigin sig_theta'         `thenNF_Tc` \ (dicts_sig, dict_ids) ->
                -- It's important that sig_theta is zonked, because
@@ -331,7 +351,7 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
     (if any isUnLiftedType zonked_mono_id_types then
                -- Unlifted bindings must be non-recursive,
                -- not top level, and non-polymorphic
-       checkTc (case top_lvl of {TopLevel -> False; NotTopLevel -> True})
+       checkTc (isNotTopLevel top_lvl)
                (unliftedBindErr "Top-level" mbind)             `thenTc_`
        checkTc (case is_rec of {Recursive -> False; NonRecursive -> True})
                (unliftedBindErr "Recursive" mbind)             `thenTc_`
@@ -354,12 +374,21 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
     mapNF_Tc zonkId mono_ids           `thenNF_Tc` \ zonked_mono_ids ->
     let
        exports  = zipWith mk_export binder_names zonked_mono_ids
-       dict_tys = map tcIdType dicts_bound
+       dict_tys = map idType dicts_bound
+
+       inlines    = mkNameSet [name | InlineSig name _ loc <- inline_sigs]
+        no_inlines = listToFM ([(name, IMustNotBeINLINEd False phase) | NoInlineSig name phase loc <- inline_sigs] ++
+                              [(name, IMustNotBeINLINEd True  phase) | InlineSig   name phase loc <- inline_sigs, maybeToBool phase])
+               -- "INLINE n foo" means inline foo, but not until at least phase n
+               -- "NOINLINE n foo" means don't inline foo until at least phase n, and even 
+               --                  then only if it is small enough etc.
+               -- "NOINLINE foo" means don't inline foo ever, which we signal with a (IMustNotBeINLINEd Nothing)
+               -- See comments in CoreUnfold.blackListed for the Authorised Version
 
        mk_export binder_name zonked_mono_id
          = (tyvars, 
-            TcId (setIdInfo poly_id (prag_info_fn binder_name)), 
-            TcId zonked_mono_id)
+            attachNoInlinePrag no_inlines poly_id,
+            zonked_mono_id)
          where
            (tyvars, poly_id) = 
                case maybeSig tc_ty_sigs binder_name of
@@ -367,7 +396,7 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
                        (sig_tyvars, sig_poly_id)
                  Nothing -> (real_tyvars_to_gen_list, new_poly_id)
 
-           new_poly_id = mkUserId binder_name poly_ty
+           new_poly_id = mkVanillaId binder_name poly_ty
            poly_ty = mkForAllTys real_tyvars_to_gen_list 
                        $ mkFunTys dict_tys 
                        $ idType (zonked_mono_id)
@@ -378,8 +407,7 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
                -- at all.
        
        pat_binders :: [Name]
-       pat_binders = map fst $ bagToList $ collectMonoBinders $ 
-                     (justPatBindings mbind EmptyMonoBinds)
+       pat_binders = collectMonoBinders (justPatBindings mbind EmptyMonoBinds)
     in
        -- CHECK FOR UNBOXED BINDERS IN PATTERN BINDINGS
     mapTc (\id -> checkTc (not (idName id `elem` pat_binders
@@ -389,12 +417,14 @@ tcBindWithSigs top_lvl mbind tc_ty_sigs is_rec prag_info_fn
 
         -- BUILD RESULTS
     returnTc (
+        -- pprTrace "binding.." (ppr ((dicts_bound, dict_binds), exports, [idType poly_id | (_, poly_id, _) <- exports])) $
         AbsBinds real_tyvars_to_gen_list
                  dicts_bound
                  exports
+                 inlines
                  (dict_binds `andMonoBinds` mbind'),
         lie_free,
-        [poly_id | (_, TcId poly_id, _) <- exports]
+        [poly_id | (_, poly_id, _) <- exports]
     )
   where
     tysig_names     = [name | (TySigInfo name _ _ _ _ _ _ _) <- tc_ty_sigs]
@@ -404,6 +434,11 @@ justPatBindings bind@(PatMonoBind _ _ _) binds = bind `andMonoBinds` binds
 justPatBindings (AndMonoBinds b1 b2) binds = 
        justPatBindings b1 (justPatBindings b2 binds) 
 justPatBindings other_bind binds = binds
+
+attachNoInlinePrag no_inlines bndr
+  = case lookupFM no_inlines (idName bndr) of
+       Just prag -> bndr `setInlinePragma` prag
+       Nothing   -> bndr
 \end{code}
 
 Polymorphic recursion
@@ -468,7 +503,7 @@ is doing.
 %*                                                                     *
 %************************************************************************
 
-@getTyVarsToGen@ decides what type variables generalise over.
+@getTyVarsToGen@ decides what type variables to generalise over.
 
 For a "restricted group" -- see the monomorphism restriction
 for a definition -- we bind no dictionaries, and
@@ -510,22 +545,33 @@ getTyVarsToGen is_unrestricted mono_id_tys lie
   = tcGetGlobalTyVars                  `thenNF_Tc` \ free_tyvars ->
     zonkTcTypes mono_id_tys            `thenNF_Tc` \ zonked_mono_id_tys ->
     let
-       tyvars_to_gen = tyVarsOfTypes zonked_mono_id_tys `minusVarSet` free_tyvars
+       body_tyvars = tyVarsOfTypes zonked_mono_id_tys `minusVarSet` free_tyvars
+       fds         = getAllFunDepsOfLIE lie
     in
     if is_unrestricted
     then
-       returnNF_Tc (emptyVarSet, tyvars_to_gen)
+         -- We need to augment the type variables that appear explicitly in
+         -- the type by those that are determined by the functional dependencies.
+         -- e.g. suppose our type is   C a b => a -> a
+         --    with the fun-dep  a->b
+         -- Then we should generalise over b too; otherwise it will be
+         -- reported as ambiguous.
+       zonkFunDeps fds         `thenNF_Tc` \ fds' ->
+       let tvFundep        = tyVarFunDep fds'
+           extended_tyvars = oclose tvFundep body_tyvars
+       in
+       returnNF_Tc (emptyVarSet, extended_tyvars)
     else
        -- This recover and discard-errs is to avoid duplicate error
        -- messages; this, after all, is an "extra" call to tcSimplify
-       recoverNF_Tc (returnNF_Tc (emptyVarSet, tyvars_to_gen))         $
+       recoverNF_Tc (returnNF_Tc (emptyVarSet, body_tyvars))           $
        discardErrsTc                                                   $
 
-       tcSimplify (text "getTVG") NotTopLevel tyvars_to_gen lie    `thenTc` \ (_, _, constrained_dicts) ->
+       tcSimplify (text "getTVG") body_tyvars lie    `thenTc` \ (_, _, constrained_dicts) ->
        let
          -- ASSERT: dicts_sig is already zonked!
            constrained_tyvars    = foldrBag (unionVarSet . tyVarsOfInst) emptyVarSet constrained_dicts
-           reduced_tyvars_to_gen = tyvars_to_gen `minusVarSet` constrained_tyvars
+           reduced_tyvars_to_gen = body_tyvars `minusVarSet` constrained_tyvars
         in
         returnTc (constrained_tyvars, reduced_tyvars_to_gen)
 \end{code}
@@ -538,27 +584,16 @@ isUnRestrictedGroup :: [Name]             -- Signatures given for these
 
 is_elem v vs = isIn "isUnResMono" v vs
 
-isUnRestrictedGroup sigs (PatMonoBind (VarPatIn v) _ _) = v `is_elem` sigs
-isUnRestrictedGroup sigs (PatMonoBind other      _ _)  = False
+isUnRestrictedGroup sigs (PatMonoBind other        _ _) = False
 isUnRestrictedGroup sigs (VarMonoBind v _)             = v `is_elem` sigs
-isUnRestrictedGroup sigs (FunMonoBind _ _ _ _)         = True
+isUnRestrictedGroup sigs (FunMonoBind v _ matches _)   = any isUnRestrictedMatch matches || 
+                                                         v `is_elem` sigs
 isUnRestrictedGroup sigs (AndMonoBinds mb1 mb2)                = isUnRestrictedGroup sigs mb1 &&
                                                          isUnRestrictedGroup sigs mb2
 isUnRestrictedGroup sigs EmptyMonoBinds                        = True
-\end{code}
 
-@defaultUncommittedTyVar@ checks for generalisation over unboxed
-types, and defaults any TypeKind TyVars to BoxedTypeKind.
-
-\begin{code}
-defaultUncommittedTyVar tyvar
-  | tyVarKind tyvar == openTypeKind
-  = newTcTyVar boxedTypeKind                                   `thenNF_Tc` \ boxed_tyvar ->
-    unifyTauTy (mkTyVarTy tyvar) (mkTyVarTy boxed_tyvar)       `thenTc_`
-    returnTc boxed_tyvar
-
-  | otherwise
-  = returnTc tyvar
+isUnRestrictedMatch (Match _ [] Nothing _) = False     -- No args, no signature
+isUnRestrictedMatch other                 = True       -- Some args or a signature
 \end{code}
 
 
@@ -573,52 +608,75 @@ The signatures have been dealt with already.
 
 \begin{code}
 tcMonoBinds :: RenamedMonoBinds 
-           -> [TcSigInfo s]
+           -> [TcSigInfo]
            -> RecFlag
-           -> TcM s (TcMonoBinds s, 
-                     LIE s,            -- LIE required
+           -> TcM (TcMonoBinds, 
+                     LIE,              -- LIE required
                      [Name],           -- Bound names
-                     [TcIdBndr s])     -- Corresponding monomorphic bound things
+                     [TcId])   -- Corresponding monomorphic bound things
 
 tcMonoBinds mbinds tc_ty_sigs is_rec
   = tc_mb_pats mbinds          `thenTc` \ (complete_it, lie_req_pat, tvs, ids, lie_avail) ->
     let
-       tv_list           = bagToList tvs
-       (names, mono_ids) = unzip (bagToList ids)
+       id_list           = bagToList ids
+       (names, mono_ids) = unzip id_list
+
+               -- This last defn is the key one:
+               -- extend the val envt with bindings for the 
+               -- things bound in this group, overriding the monomorphic
+               -- ids with the polymorphic ones from the pattern
+       extra_val_env = case is_rec of
+                         Recursive    -> map mk_bind id_list
+                         NonRecursive -> []
     in
        -- Don't know how to deal with pattern-bound existentials yet
     checkTc (isEmptyBag tvs && isEmptyBag lie_avail) 
            (existentialExplode mbinds)                 `thenTc_` 
 
-       -- *Before* checking the RHSs, but *after* checking *all* the patterns, 
+       -- *Before* checking the RHSs, but *after* checking *all* the patterns,
        -- extend the envt with bindings for all the bound ids;
        --   and *then* override with the polymorphic Ids from the signatures
        -- That is the whole point of the "complete_it" stuff.
-    tcExtendEnvWithPat ids (tcExtendEnvWithPat sig_ids 
-               complete_it
-    )                                          `thenTc` \ (mbinds', lie_req_rhss) ->
+       --
+       -- There's a further wrinkle: we have to delay extending the environment
+       -- until after we've dealt with any pattern-bound signature type variables
+       -- Consider  f (x::a) = ...f...
+       -- We're going to check that a isn't unified with anything in the envt, 
+       -- so f itself had better not be!  So we pass the envt binding f into
+       -- complete_it, which extends the actual envt in TcMatches.tcMatch, after
+       -- dealing with the signature tyvars
+
+    complete_it extra_val_env                          `thenTc` \ (mbinds', lie_req_rhss) ->
+
     returnTc (mbinds', lie_req_pat `plusLIE` lie_req_rhss, names, mono_ids)
   where
-    sig_fn name = case maybeSig tc_ty_sigs name of
-                       Nothing                                -> Nothing
-                       Just (TySigInfo _ _ _ _ _ mono_id _ _) -> Just mono_id
 
-    sig_ids = listToBag [(name,poly_id) | TySigInfo name poly_id _ _ _ _ _ _ <- tc_ty_sigs]
+       -- This function is used when dealing with a LHS binder; we make a monomorphic
+       -- version of the Id.  We check for type signatures
+    tc_pat_bndr name pat_ty
+       = case maybeSig tc_ty_sigs name of
+           Nothing
+               -> newLocalId (getOccName name) pat_ty (getSrcLoc name)
 
-    kind = case is_rec of
-            Recursive    -> boxedTypeKind      -- Recursive, so no unboxed types
-            NonRecursive -> openTypeKind       -- Non-recursive, so we permit unboxed types
+           Just (TySigInfo _ _ _ _ _ mono_id _ _)
+               -> tcAddSrcLoc (getSrcLoc name)                         $
+                  unifyTauTy (idType mono_id) pat_ty   `thenTc_`
+                  returnTc mono_id
+
+    mk_bind (name, mono_id) = case maybeSig tc_ty_sigs name of
+                               Nothing                                   -> (name, mono_id)
+                               Just (TySigInfo name poly_id _ _ _ _ _ _) -> (name, poly_id)
 
     tc_mb_pats EmptyMonoBinds
-      = returnTc (returnTc (EmptyMonoBinds, emptyLIE), emptyLIE, emptyBag, emptyBag, emptyLIE)
+      = returnTc (\ xve -> returnTc (EmptyMonoBinds, emptyLIE), emptyLIE, emptyBag, emptyBag, emptyLIE)
 
     tc_mb_pats (AndMonoBinds mb1 mb2)
       = tc_mb_pats mb1         `thenTc` \ (complete_it1, lie_req1, tvs1, ids1, lie_avail1) ->
         tc_mb_pats mb2         `thenTc` \ (complete_it2, lie_req2, tvs2, ids2, lie_avail2) ->
        let
-          complete_it = complete_it1   `thenTc` \ (mb1', lie1) ->
-                        complete_it2   `thenTc` \ (mb2', lie2) ->
-                        returnTc (AndMonoBinds mb1' mb2', lie1 `plusLIE` lie2)
+          complete_it xve = complete_it1 xve   `thenTc` \ (mb1', lie1) ->
+                            complete_it2 xve   `thenTc` \ (mb2', lie2) ->
+                            returnTc (AndMonoBinds mb1' mb2', lie1 `plusLIE` lie2)
        in
        returnTc (complete_it,
                  lie_req1 `plusLIE` lie_req2,
@@ -627,26 +685,44 @@ tcMonoBinds mbinds tc_ty_sigs is_rec
                  lie_avail1 `plusLIE` lie_avail2)
 
     tc_mb_pats (FunMonoBind name inf matches locn)
-      = newTyVarTy boxedTypeKind       `thenNF_Tc` \ pat_ty ->
-       tcVarPat sig_fn name pat_ty     `thenTc` \ bndr_id ->
+      = newTyVarTy kind                `thenNF_Tc` \ bndr_ty -> 
+       tc_pat_bndr name bndr_ty        `thenTc` \ bndr_id ->
        let
-          complete_it = tcAddSrcLoc locn                       $
-                        tcMatchesFun name pat_ty matches       `thenTc` \ (matches', lie) ->
-                        returnTc (FunMonoBind (TcId bndr_id) inf matches' locn, lie)
+          complete_it xve = tcAddSrcLoc locn                           $
+                            tcMatchesFun xve name bndr_ty  matches     `thenTc` \ (matches', lie) ->
+                            returnTc (FunMonoBind bndr_id inf matches' locn, lie)
        in
        returnTc (complete_it, emptyLIE, emptyBag, unitBag (name, bndr_id), emptyLIE)
 
-    tc_mb_pats bind@(PatMonoBind pat grhss_and_binds locn)
+    tc_mb_pats bind@(PatMonoBind pat grhss locn)
       = tcAddSrcLoc locn               $
-       newTyVarTy kind                 `thenNF_Tc` \ pat_ty ->
-       tcPat sig_fn pat pat_ty         `thenTc` \ (pat', lie_req, tvs, ids, lie_avail) ->
+       newTyVarTy kind                 `thenNF_Tc` \ pat_ty -> 
+
+               --      Now typecheck the pattern
+               -- We don't support binding fresh type variables in the
+               -- pattern of a pattern binding.  For example, this is illegal:
+               --      (x::a, y::b) = e
+               -- whereas this is ok
+               --      (x::Int, y::Bool) = e
+               --
+               -- We don't check explicitly for this problem.  Instead, we simply
+               -- type check the pattern with tcPat.  If the pattern mentions any
+               -- fresh tyvars we simply get an out-of-scope type variable error
+       tcPat tc_pat_bndr pat pat_ty            `thenTc` \ (pat', lie_req, tvs, ids, lie_avail) ->
        let
-          complete_it = tcAddSrcLoc locn                               $
-                        tcAddErrCtxt (patMonoBindsCtxt bind)           $
-                        tcGRHSsAndBinds grhss_and_binds pat_ty PatBindRhs      `thenTc` \ (grhss_and_binds', lie) ->
-                        returnTc (PatMonoBind pat' grhss_and_binds' locn, lie)
+          complete_it xve = tcAddSrcLoc locn                           $
+                            tcAddErrCtxt (patMonoBindsCtxt bind)       $
+                            tcExtendLocalValEnv xve                    $
+                            tcGRHSs grhss pat_ty PatBindRhs            `thenTc` \ (grhss', lie) ->
+                            returnTc (PatMonoBind pat' grhss' locn, lie)
        in
        returnTc (complete_it, lie_req, tvs, ids, lie_avail)
+
+       -- Figure out the appropriate kind for the pattern,
+       -- and generate a suitable type variable 
+    kind = case is_rec of
+               Recursive    -> boxedTypeKind   -- Recursive, so no unboxed types
+               NonRecursive -> openTypeKind    -- Non-recursive, so we permit unboxed types
 \end{code}
 
 %************************************************************************
@@ -664,13 +740,53 @@ The error message here is somewhat unsatisfactory, but it'll do for
 now (ToDo).
 
 \begin{code}
-checkSigMatch []
-  = returnTc (error "checkSigMatch", emptyLIE)
+checkSigMatch :: TopLevelFlag -> [Name] -> [TcId] -> [TcSigInfo] -> TcM (Maybe (TcThetaType, LIE))
+checkSigMatch top_lvl binder_names mono_ids sigs
+  | main_bound_here
+  =    -- First unify the main_id with IO t, for any old t
+    tcSetErrCtxt mainTyCheckCtxt (
+       tcLookupTyCon ioTyConName               `thenTc`    \ ioTyCon ->
+       newTyVarTy boxedTypeKind                `thenNF_Tc` \ t_tv ->
+       unifyTauTy ((mkTyConApp ioTyCon [t_tv]))
+                  (idType main_mono_id)
+    )                                          `thenTc_`
+
+       -- Now check the signatures
+       -- Must do this after the unification with IO t, 
+       -- in case of a silly signature like
+       --      main :: forall a. a
+       -- The unification to IO t will bind the type variable 'a',
+       -- which is just waht check_one_sig looks for
+    mapTc check_one_sig sigs                   `thenTc_`
+    mapTc check_main_ctxt sigs                 `thenTc_` 
+    returnTc (Just ([], emptyLIE))
+
+  | not (null sigs)
+  = mapTc check_one_sig sigs                   `thenTc_`
+    mapTc check_one_ctxt all_sigs_but_first    `thenTc_`
+    returnTc (Just (theta1, sig_lie))
+
+  | otherwise
+  = returnTc Nothing           -- No constraints from type sigs
+
+  where
+    (TySigInfo _ id1 _ theta1 _ _ _ _ : all_sigs_but_first) = sigs
 
-checkSigMatch tc_ty_sigs@( sig1@(TySigInfo _ id1 _ theta1 _ _ _ _) : all_sigs_but_first )
-  =    -- CHECK THAT THE SIGNATURE TYVARS AND TAU_TYPES ARE OK
+    sig1_dict_tys      = mk_dict_tys theta1
+    n_sig1_dict_tys    = length sig1_dict_tys
+    sig_lie            = mkLIE (concat [insts | TySigInfo _ _ _ _ _ _ insts _ <- sigs])
+
+    maybe_main        = find_main top_lvl binder_names mono_ids
+    main_bound_here   = maybeToBool maybe_main
+    Just main_mono_id = maybe_main
+                     
+       -- CHECK THAT THE SIGNATURE TYVARS AND TAU_TYPES ARE OK
        -- Doesn't affect substitution
-    mapTc check_one_sig tc_ty_sigs     `thenTc_`
+    check_one_sig (TySigInfo _ id sig_tyvars sig_theta sig_tau _ _ src_loc)
+      = tcAddSrcLoc src_loc                                    $
+       tcAddErrCtxtM (sigCtxt (sig_msg id) sig_tyvars sig_theta sig_tau)       $
+       checkSigTyVars sig_tyvars (idFreeTyVars id)
+
 
        -- CHECK THAT ALL THE SIGNATURE CONTEXTS ARE UNIFIABLE
        -- The type signatures on a mutually-recursive group of definitions
@@ -679,15 +795,7 @@ checkSigMatch tc_ty_sigs@( sig1@(TySigInfo _ id1 _ theta1 _ _ _ _) : all_sigs_bu
        -- We unify them because, with polymorphic recursion, their types
        -- might not otherwise be related.  This is a rather subtle issue.
        -- ToDo: amplify
-    mapTc check_one_cxt all_sigs_but_first             `thenTc_`
-
-    returnTc (theta1, sig_lie)
-  where
-    sig1_dict_tys      = mk_dict_tys theta1
-    n_sig1_dict_tys    = length sig1_dict_tys
-    sig_lie            = mkLIE [inst | TySigInfo _ _ _ _ _ _ inst _ <- tc_ty_sigs]
-
-    check_one_cxt sig@(TySigInfo _ id _ theta _ _ _ src_loc)
+    check_one_ctxt sig@(TySigInfo _ id _ theta _ _ _ src_loc)
        = tcAddSrcLoc src_loc   $
         tcAddErrCtxt (sigContextsCtxt id1 id) $
         checkTc (length this_sig_dict_tys == n_sig1_dict_tys)
@@ -696,12 +804,22 @@ checkSigMatch tc_ty_sigs@( sig1@(TySigInfo _ id1 _ theta1 _ _ _ _) : all_sigs_bu
       where
         this_sig_dict_tys = mk_dict_tys theta
 
-    check_one_sig (TySigInfo _ id sig_tyvars _ sig_tau _ _ src_loc)
-      = tcAddSrcLoc src_loc                                    $
-       tcAddErrCtxtM (sigCtxt (quotes (ppr id)) sig_tau)       $
-       checkSigTyVars sig_tyvars
+       -- CHECK THAT FOR A GROUP INVOLVING Main.main, all 
+       -- the signature contexts are empty (what a bore)
+    check_main_ctxt sig@(TySigInfo _ id _ theta _ _ _ src_loc)
+       = tcAddSrcLoc src_loc   $
+         checkTc (null theta) (mainContextsErr id)
+
+    mk_dict_tys theta = map mkPredTy theta
 
-    mk_dict_tys theta = [mkDictTy c ts | (c,ts) <- theta]
+    sig_msg id = ptext SLIT("When checking the type signature for") <+> quotes (ppr id)
+
+       -- Search for Main.main in the binder_names, return corresponding mono_id
+    find_main NotTopLevel binder_names mono_ids = Nothing
+    find_main TopLevel    binder_names mono_ids = go binder_names mono_ids
+    go [] [] = Nothing
+    go (n:ns) (m:ms) | n `hasKey` mainKey = Just m
+                    | otherwise          = go ns ms
 \end{code}
 
 
@@ -711,28 +829,13 @@ checkSigMatch tc_ty_sigs@( sig1@(TySigInfo _ id1 _ theta1 _ _ _ _) : all_sigs_bu
 %*                                                                     *
 %************************************************************************
 
-
-@tcPragmaSigs@ munches up the "signatures" that arise through *user*
+@tcSpecSigs@ munches up the specialisation "signatures" that arise through *user*
 pragmas.  It is convenient for them to appear in the @[RenamedSig]@
 part of a binding because then the same machinery can be used for
 moving them into place as is done for type signatures.
 
-\begin{code}
-tcPragmaSigs :: [RenamedSig]           -- The pragma signatures
-            -> TcM s (Name -> IdInfo,  -- Maps name to the appropriate IdInfo
-                      TcMonoBinds s,
-                      LIE s)
-
-tcPragmaSigs sigs
-  = mapAndUnzip3Tc tcPragmaSig sigs    `thenTc` \ (maybe_info_modifiers, binds, lies) ->
-    let
-       prag_fn name = foldr ($) noIdInfo [f | Just (n,f) <- maybe_info_modifiers, n==name]
-    in
-    returnTc (prag_fn, andMonoBindList binds, plusLIEs lies)
-\end{code}
+They look like this:
 
-The interesting case is for SPECIALISE pragmas.  There are two forms.
-Here's the first form:
 \begin{verbatim}
        f :: Ord a => [a] -> b -> b
        {-# SPECIALIZE f :: [Int] -> b -> b #-}
@@ -755,88 +858,41 @@ specialiser will subsequently discover that there's a call of @f@ at
 Int, and will create a specialisation for @f@.  After that, the
 binding for @f*@ can be discarded.
 
-The second form is this:
-\begin{verbatim}
-       f :: Ord a => [a] -> b -> b
-       {-# SPECIALIZE f :: [Int] -> b -> b = g #-}
-\end{verbatim}
-
-Here @g@ is specified as a function that implements the specialised
-version of @f@.  Suppose that g has type (a->b->b); that is, g's type
-is more general than that required.  For this we generate
-\begin{verbatim}
-       f@Int = /\b -> g Int b
-       f* = f@Int
-\end{verbatim}
-
-Here @f@@Int@ is a SpecId, the specialised version of @f@.  It inherits
-f's export status etc.  @f*@ is a SpecPragmaId, as before, which just serves
-to prevent @f@@Int@ from being discarded prematurely.  After specialisation,
-if @f@@Int@ is going to be used at all it will be used explicitly, so the simplifier can
-discard the f* binding.
-
-Actually, there is really only point in giving a SPECIALISE pragma on exported things,
-and the simplifer won't discard SpecIds for exporte things anyway, so maybe this is
-a bit of overkill.
+We used to have a form
+       {-# SPECIALISE f :: <type> = g #-}
+which promised that g implemented f at <type>, but we do that with 
+a RULE now:
+       {-# SPECIALISE (f::<type) = g #-}
 
 \begin{code}
-tcPragmaSig :: RenamedSig -> TcM s (Maybe (Name, IdInfo -> IdInfo), TcMonoBinds s, LIE s)
-tcPragmaSig (Sig _ _ _)       = returnTc (Nothing, EmptyMonoBinds, emptyLIE)
-tcPragmaSig (SpecInstSig _ _) = returnTc (Nothing, EmptyMonoBinds, emptyLIE)
-
-tcPragmaSig (InlineSig name loc)
-  = returnTc (Just (name, setInlinePragInfo IWantToBeINLINEd), EmptyMonoBinds, emptyLIE)
-
-tcPragmaSig (NoInlineSig name loc)
-  = returnTc (Just (name, setInlinePragInfo IMustNotBeINLINEd), EmptyMonoBinds, emptyLIE)
-
-tcPragmaSig (SpecSig name poly_ty maybe_spec_name src_loc)
+tcSpecSigs :: [RenamedSig] -> TcM (TcMonoBinds, LIE)
+tcSpecSigs (SpecSig name poly_ty src_loc : sigs)
   =    -- SPECIALISE f :: forall b. theta => tau  =  g
     tcAddSrcLoc src_loc                                $
     tcAddErrCtxt (valSpecSigCtxt name poly_ty) $
 
        -- Get and instantiate its alleged specialised type
-    tcHsTcType poly_ty                         `thenTc` \ sig_ty ->
+    tcHsSigType poly_ty                                `thenTc` \ sig_ty ->
 
        -- Check that f has a more general type, and build a RHS for
        -- the spec-pragma-id at the same time
     tcExpr (HsVar name) sig_ty                 `thenTc` \ (spec_expr, spec_lie) ->
 
-    case maybe_spec_name of
-       Nothing ->      -- Just specialise "f" by building a SpecPragmaId binding
-                       -- It is the thing that makes sure we don't prematurely 
-                       -- dead-code-eliminate the binding we are really interested in.
-                  newSpecPragmaId name sig_ty          `thenNF_Tc` \ spec_id ->
-                  returnTc (Nothing, VarMonoBind (TcId spec_id) spec_expr, spec_lie)
-
-       Just g_name ->  -- Don't create a SpecPragmaId.  Instead add some suitable IdIfo
-               
-               panic "Can't handle SPECIALISE with a '= g' part"
-
-       {-  Not yet.  Because we're still in the TcType world we
-           can't really add to the SpecEnv of the Id.  Instead we have to
-           record the information in a different sort of Sig, and add it to
-           the IdInfo after zonking.
-
-           For now we just leave out this case
-
-                       -- Get the type of f, and find out what types
-                       --  f has to be instantiated at to give the signature type
-                   tcLookupLocalValueOK "tcPragmaSig" name     `thenNF_Tc` \ f_id ->
-                   tcInstTcType (idType f_id)          `thenNF_Tc` \ (f_tyvars, f_rho) ->
-
-                   let
-                       (sig_tyvars, sig_theta, sig_tau) = splitSigmaTy sig_ty
-                       (f_theta, f_tau)                 = splitRhoTy f_rho
-                       sig_tyvar_set                    = mkVarSet sig_tyvars
-                   in
-                   unifyTauTy sig_tau f_tau            `thenTc_`
-
-                   tcPolyExpr str (HsVar g_name) (mkSigmaTy sig_tyvars f_theta sig_tau)        `thenTc` \ (_, _, 
-       -}
-
-tcPragmaSig other = pprTrace "tcPragmaSig: ignoring" (ppr other) $
-                   returnTc (Nothing, EmptyMonoBinds, emptyLIE)
+       -- Squeeze out any Methods (see comments with tcSimplifyToDicts)
+    tcSimplifyToDicts spec_lie                 `thenTc` \ (spec_lie1, spec_binds) ->
+
+       -- Just specialise "f" by building a SpecPragmaId binding
+       -- It is the thing that makes sure we don't prematurely 
+       -- dead-code-eliminate the binding we are really interested in.
+    newSpecPragmaId name sig_ty                `thenNF_Tc` \ spec_id ->
+
+       -- Do the rest and combine
+    tcSpecSigs sigs                    `thenTc` \ (binds_rest, lie_rest) ->
+    returnTc (binds_rest `andMonoBinds` VarMonoBind spec_id (mkHsLet spec_binds spec_expr),
+             lie_rest   `plusLIE`      spec_lie1)
+
+tcSpecSigs (other_sig : sigs) = tcSpecSigs sigs
+tcSpecSigs []                = returnTc (EmptyMonoBinds, emptyLIE)
 \end{code}
 
 
@@ -854,22 +910,7 @@ patMonoBindsCtxt bind
 -----------------------------------------------
 valSpecSigCtxt v ty
   = sep [ptext SLIT("In a SPECIALIZE pragma for a value:"),
-        nest 4 (ppr v <+> ptext SLIT(" ::") <+> ppr ty)]
-
------------------------------------------------
-notAsPolyAsSigErr sig_tau mono_tyvars
-  = hang (ptext SLIT("A type signature is more polymorphic than the inferred type"))
-       4  (vcat [text "Can't for-all the type variable(s)" <+> 
-                 pprQuotedList mono_tyvars,
-                 text "in the type" <+> quotes (ppr sig_tau)
-          ])
-
------------------------------------------------
-badMatchErr sig_ty inferred_ty
-  = hang (ptext SLIT("Type signature doesn't match inferred type"))
-        4 (vcat [hang (ptext SLIT("Signature:")) 4 (ppr sig_ty),
-                     hang (ptext SLIT("Inferred :")) 4 (ppr inferred_ty)
-          ])
+        nest 4 (ppr v <+> dcolon <+> ppr ty)]
 
 -----------------------------------------------
 unboxedPatBindErr id
@@ -883,11 +924,22 @@ bindSigsCtxt ids
 -----------------------------------------------
 sigContextsErr
   = ptext SLIT("Mismatched contexts")
+
 sigContextsCtxt s1 s2
   = hang (hsep [ptext SLIT("When matching the contexts of the signatures for"), 
                quotes (ppr s1), ptext SLIT("and"), quotes (ppr s2)])
         4 (ptext SLIT("(the signature contexts in a mutually recursive group should all be identical)"))
 
+mainContextsErr id
+  | id `hasKey` mainKey = ptext SLIT("Main.main cannot be overloaded")
+  | otherwise
+  = quotes (ppr id) <+> ptext SLIT("cannot be overloaded") <> char ',' <> -- sigh; workaround for cpp's inability to deal
+    ptext SLIT("because it is mutually recursive with Main.main")         -- with commas inside SLIT strings.
+
+mainTyCheckCtxt
+  = hsep [ptext SLIT("When checking that"), quotes (ptext SLIT("main")),
+         ptext SLIT("has the required type")]
+
 -----------------------------------------------
 unliftedBindErr flavour mbind
   = hang (text flavour <+> ptext SLIT("bindings for unlifted types aren't allowed"))