Add ASSERTs to all calls of nameModule
[ghc-hetmet.git] / compiler / typecheck / TcSplice.lhs
index 9ec400d..7139fa8 100644 (file)
@@ -6,14 +6,15 @@
 TcSplice: Template Haskell splices
 
 \begin{code}
-{-# OPTIONS -w #-}
+{-# OPTIONS -fno-warn-unused-imports -fno-warn-unused-binds #-}
 -- The above warning supression flag is a temporary kludge.
 -- While working on this module you are encouraged to remove it and fix
 -- any warnings in the module. See
 --     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
 -- for details
 
-module TcSplice( tcSpliceExpr, tcSpliceDecls, tcBracket ) where
+module TcSplice( tcSpliceExpr, tcSpliceDecls, tcBracket,
+                 runQuasiQuoteExpr, runQuasiQuotePat ) where
 
 #include "HsVersions.h"
 
@@ -45,7 +46,6 @@ import OccName
 import Var
 import Module
 import TcRnMonad
-import IfaceEnv
 import Class
 import TyCon
 import DataCon
@@ -59,20 +59,23 @@ import ErrUtils
 import SrcLoc
 import Outputable
 import Unique
-import DynFlags
-import PackageConfig
 import Maybe
 import BasicTypes
 import Panic
 import FastString
+import Data.Typeable (cast)
+import Exception
 
 import qualified Language.Haskell.TH as TH
 -- THSyntax gives access to internal functions and data types
 import qualified Language.Haskell.TH.Syntax as TH
 
 import GHC.Exts                ( unsafeCoerce#, Int#, Int(..) )
-import Control.Monad   ( liftM )
-import qualified Control.Exception  as Exception( userErrors )
+#if __GLASGOW_HASKELL__ < 609
+import qualified Exception ( userErrors )
+#else
+import System.IO.Error
+#endif
 \end{code}
 
 Note [Template Haskell levels]
@@ -160,14 +163,23 @@ The predicate we use is TcEnv.thTopLevelId.
 %************************************************************************
 
 \begin{code}
+tcBracket     :: HsBracket Name -> BoxyRhoType -> TcM (LHsExpr TcId)
 tcSpliceDecls :: LHsExpr Name -> TcM [LHsDecl RdrName]
 tcSpliceExpr  :: HsSplice Name -> BoxyRhoType -> TcM (HsExpr TcId)
 kcSpliceType  :: HsSplice Name -> TcM (HsType Name, TcKind)
        -- None of these functions add constraints to the LIE
 
+runQuasiQuoteExpr :: HsQuasiQuote Name -> TcM (LHsExpr RdrName)
+runQuasiQuotePat  :: HsQuasiQuote Name -> TcM (LPat RdrName)
+
 #ifndef GHCI
-tcSpliceExpr n e ty = pprPanic "Cant do tcSpliceExpr without GHCi" (ppr e)
-tcSpliceDecls e     = pprPanic "Cant do tcSpliceDecls without GHCi" (ppr e)
+tcBracket     x _ = pprPanic "Cant do tcBracket without GHCi"     (ppr x)
+tcSpliceExpr  e   = pprPanic "Cant do tcSpliceExpr without GHCi"  (ppr e)
+tcSpliceDecls x   = pprPanic "Cant do tcSpliceDecls without GHCi" (ppr x)
+kcSpliceType  x   = pprPanic "Cant do kcSpliceType without GHCi"  (ppr x)
+
+runQuasiQuoteExpr q = pprPanic "Cant do runQuasiQuoteExpr without GHCi" (ppr q)
+runQuasiQuotePat  q = pprPanic "Cant do runQuasiQuotePat without GHCi" (ppr q)
 #else
 \end{code}
 
@@ -190,31 +202,29 @@ Desugared:        f = do { s7 <- g Int 3
                       ; return (ConE "Data.Maybe.Just" s7) }
 
 \begin{code}
-tcBracket :: HsBracket Name -> BoxyRhoType -> TcM (LHsExpr TcId)
-tcBracket brack res_ty
-  = getStage                           `thenM` \ level ->
-    case bracketOK level of {
+tcBracket brack res_ty = do
+   level <- getStage
+   case bracketOK level of {
        Nothing         -> failWithTc (illegalBracket level) ;
-       Just next_level ->
+       Just next_level -> do
 
        -- Typecheck expr to make sure it is valid,
        -- but throw away the results.  We'll type check
        -- it again when we actually use it.
-    recordThUse                                `thenM_`
-    newMutVar []                       `thenM` \ pending_splices ->
-    getLIEVar                          `thenM` \ lie_var ->
+    recordThUse
+    pending_splices <- newMutVar []
+    lie_var <- getLIEVar
 
-    setStage (Brack next_level pending_splices lie_var) (
-       getLIE (tc_bracket next_level brack)
-    )                                  `thenM` \ (meta_ty, lie) ->
-    tcSimplifyBracket lie              `thenM_`  
+    (meta_ty, lie) <- setStage (Brack next_level pending_splices lie_var)
+                               (getLIE (tc_bracket next_level brack))
+    tcSimplifyBracket lie
 
        -- Make the expected type have the right shape
-    boxyUnify meta_ty res_ty           `thenM_`
+    boxyUnify meta_ty res_ty
 
        -- Return the original expression, not the type-decorated one
-    readMutVar pending_splices         `thenM` \ pendings ->
-    returnM (noLoc (HsBracketOut brack pendings))
+    pendings <- readMutVar pending_splices
+    return (noLoc (HsBracketOut brack pendings))
     }
 
 tc_bracket :: ThLevel -> HsBracket Name -> TcM TcType
@@ -228,23 +238,23 @@ tc_bracket use_lvl (VarBr name)   -- Note [Quoting names]
                | otherwise
                -> do { checkTc (use_lvl == bind_lvl)
                                (quotedNameStageErr name) }
-           other -> pprPanic "th_bracket" (ppr name)
+           _ -> pprPanic "th_bracket" (ppr name)
 
        ; tcMetaTy nameTyConName        -- Result type is Var (not Q-monadic)
        }
 
-tc_bracket use_lvl (ExpBr expr) 
+tc_bracket _ (ExpBr expr) 
   = do { any_ty <- newFlexiTyVarTy liftedTypeKind
        ; tcMonoExpr expr any_ty
        ; tcMetaTy expQTyConName }
        -- Result type is Expr (= Q Exp)
 
-tc_bracket use_lvl (TypBr typ) 
+tc_bracket _ (TypBr typ) 
   = do { tcHsSigType ExprSigCtxt typ
        ; tcMetaTy typeQTyConName }
        -- Result type is Type (= Q Typ)
 
-tc_bracket use_lvl (DecBr decls)
+tc_bracket _ (DecBr decls)
   = do {  tcTopSrcDecls emptyModDetails decls
        -- Typecheck the declarations, dicarding the result
        -- We'll get all that stuff later, when we splice it in
@@ -255,12 +265,13 @@ tc_bracket use_lvl (DecBr decls)
        -- Result type is Q [Dec]
     }
 
-tc_bracket use_lvl (PatBr _)
-  = failWithTc (ptext SLIT("Tempate Haskell pattern brackets are not supported yet"))
+tc_bracket _ (PatBr _)
+  = failWithTc (ptext (sLit "Tempate Haskell pattern brackets are not supported yet"))
 
+quotedNameStageErr :: Name -> SDoc
 quotedNameStageErr v 
-  = sep [ ptext SLIT("Stage error: the non-top-level quoted name") <+> ppr (VarBr v)
-       , ptext SLIT("must be used at the same stage at which is is bound")]
+  = sep [ ptext (sLit "Stage error: the non-top-level quoted name") <+> ppr (VarBr v)
+       , ptext (sLit "must be used at the same stage at which is is bound")]
 \end{code}
 
 
@@ -272,16 +283,16 @@ quotedNameStageErr v
 
 \begin{code}
 tcSpliceExpr (HsSplice name expr) res_ty
-  = setSrcSpan (getLoc expr)   $
-    getStage           `thenM` \ level ->
+  = setSrcSpan (getLoc expr)   $ do
+    level <- getStage
     case spliceOK level of {
        Nothing         -> failWithTc (illegalSplice level) ;
        Just next_level -> 
 
-    case level of {
+     case level of {
        Comp                   -> do { e <- tcTopSplice expr res_ty
-                                    ; returnM (unLoc e) } ;
-       Brack _ ps_var lie_var ->  
+                                    ; return (unLoc e) } ;
+       Brack _ ps_var lie_var -> do
 
        -- A splice inside brackets
        -- NB: ignore res_ty, apart from zapping it to a mono-type
@@ -289,19 +300,21 @@ tcSpliceExpr (HsSplice name expr) res_ty
        -- Here (h 4) :: Q Exp
        -- but $(h 4) :: forall a.a     i.e. anything!
 
-    unBox res_ty                               `thenM_`
-    tcMetaTy expQTyConName                     `thenM` \ meta_exp_ty ->
-    setStage (Splice next_level) (
-       setLIEVar lie_var          $
-       tcMonoExpr expr meta_exp_ty
-    )                                          `thenM` \ expr' ->
+      unBox res_ty
+      meta_exp_ty <- tcMetaTy expQTyConName
+      expr' <- setStage (Splice next_level) (
+                 setLIEVar lie_var    $
+                 tcMonoExpr expr meta_exp_ty
+               )
 
        -- Write the pending splice into the bucket
-    readMutVar ps_var                          `thenM` \ ps ->
-    writeMutVar ps_var ((name,expr') : ps)     `thenM_`
+      ps <- readMutVar ps_var
+      writeMutVar ps_var ((name,expr') : ps)
+
+      return (panic "tcSpliceExpr")    -- The returned expression is ignored
 
-    returnM (panic "tcSpliceExpr")     -- The returned expression is ignored
-    }} 
+     ; Splice {} -> panic "tcSpliceExpr Splice"
+     }} 
 
 -- tcTopSplice used to have this:
 -- Note that we do not decrement the level (to -1) before 
@@ -311,24 +324,24 @@ tcSpliceExpr (HsSplice name expr) res_ty
 -- inner escape before dealing with the outer one
 
 tcTopSplice :: LHsExpr Name -> BoxyRhoType -> TcM (LHsExpr Id)
-tcTopSplice expr res_ty
-  = tcMetaTy expQTyConName             `thenM` \ meta_exp_ty ->
+tcTopSplice expr res_ty = do
+    meta_exp_ty <- tcMetaTy expQTyConName
 
-       -- Typecheck the expression
-    tcTopSpliceExpr expr meta_exp_ty   `thenM` \ zonked_q_expr ->
+        -- Typecheck the expression
+    zonked_q_expr <- tcTopSpliceExpr expr meta_exp_ty
 
-       -- Run the expression
-    traceTc (text "About to run" <+> ppr zonked_q_expr)        `thenM_`
-    runMetaE convertToHsExpr zonked_q_expr     `thenM` \ expr2 ->
-  
-    traceTc (text "Got result" <+> ppr expr2)  `thenM_`
+        -- Run the expression
+    traceTc (text "About to run" <+> ppr zonked_q_expr)
+    expr2 <- runMetaE convertToHsExpr zonked_q_expr
+
+    traceTc (text "Got result" <+> ppr expr2)
 
     showSplice "expression" 
-              zonked_q_expr (ppr expr2)        `thenM_`
+               zonked_q_expr (ppr expr2)
 
-       -- Rename it, but bale out if there are errors
-       -- otherwise the type checker just gives more spurious errors
-    checkNoErrs (rnLExpr expr2)                        `thenM` \ (exp3, fvs) ->
+        -- Rename it, but bale out if there are errors
+        -- otherwise the type checker just gives more spurious errors
+    (exp3, _fvs) <- checkNoErrs (rnLExpr expr2)
 
     tcMonoExpr exp3 res_ty
 
@@ -358,6 +371,81 @@ tcTopSpliceExpr expr meta_ty
 
 %************************************************************************
 %*                                                                     *
+       Quasi-quoting
+%*                                                                     *
+%************************************************************************
+
+Note [Quasi-quote overview]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The GHC "quasi-quote" extension is described by Geoff Mainland's paper
+"Why it's nice to be quoted: quasiquoting for Haskell" (Haskell
+Workshop 2007).
+
+Briefly, one writes
+       [:p| stuff |]
+and the arbitrary string "stuff" gets parsed by the parser 'p', whose
+type should be Language.Haskell.TH.Quote.QuasiQuoter.  'p' must be
+defined in another module, because we are going to run it here.  It's
+a bit like a TH splice:
+       $(p "stuff")
+
+However, you can do this in patterns as well as terms.  Becuase of this,
+the splice is run by the *renamer* rather than the type checker.
+
+\begin{code}
+runQuasiQuote :: Outputable hs_syn
+              => HsQuasiQuote Name     -- Contains term of type QuasiQuoter, and the String
+              -> Name                  -- Of type QuasiQuoter -> String -> Q th_syn
+              -> String                        -- Documentation string only
+              -> Name                  -- Name of th_syn type  
+              -> (SrcSpan -> th_syn -> Either Message hs_syn)
+              -> TcM hs_syn
+runQuasiQuote (HsQuasiQuote _name quoter q_span quote) quote_selector desc meta_ty convert
+  = do { -- Check that the quoter is not locally defined, otherwise the TH
+          -- machinery will not be able to run the quasiquote.
+        ; this_mod <- getModule
+        ; let is_local = case nameModule_maybe quoter of
+                           Just mod | mod == this_mod -> True
+                                    | otherwise       -> False
+                           Nothing -> True
+       ; traceTc (text "runQQ" <+> ppr quoter <+> ppr is_local)
+        ; checkTc (not is_local) (quoteStageError quoter)
+
+         -- Build the expression 
+       ; let quoterExpr = L q_span $! HsVar $! quoter
+       ; let quoteExpr = L q_span $! HsLit $! HsString quote
+       ; let expr = L q_span $
+                    HsApp (L q_span $
+                           HsApp (L q_span (HsVar quote_selector)) quoterExpr) quoteExpr
+       ; recordThUse
+       ; meta_exp_ty <- tcMetaTy meta_ty
+
+       -- Typecheck the expression
+       ; zonked_q_expr <- tcTopSpliceExpr expr meta_exp_ty
+
+       -- Run the expression
+       ; traceTc (text "About to run" <+> ppr zonked_q_expr)
+       ; result <- runMeta convert zonked_q_expr
+       ; traceTc (text "Got result" <+> ppr result)
+       ; showSplice desc zonked_q_expr (ppr result)
+       ; return result
+       }
+
+runQuasiQuoteExpr quasiquote
+    = runQuasiQuote quasiquote quoteExpName "expression" expQTyConName convertToHsExpr
+
+runQuasiQuotePat quasiquote
+    = runQuasiQuote quasiquote quotePatName "pattern" patQTyConName convertToPat
+
+quoteStageError :: Name -> SDoc
+quoteStageError quoter
+  = sep [ptext (sLit "GHC stage restriction:") <+> ppr quoter,
+         nest 2 (ptext (sLit "is used in a quasiquote, and must be imported, not defined locally"))]
+\end{code}
+
+
+%************************************************************************
+%*                                                                     *
                Splicing a type
 %*                                                                     *
 %************************************************************************
@@ -391,8 +479,10 @@ kcSpliceType (HsSplice name hs_expr)
        -- Here (h 4) :: Q Type
        -- but $(h 4) :: forall a.a     i.e. any kind
        ; kind <- newKindVar
-       ; returnM (panic "kcSpliceType", kind)  -- The returned type is ignored
-    }}}}}
+       ; return (panic "kcSpliceType", kind)   -- The returned type is ignored
+    }
+        ; Splice {} -> panic "kcSpliceType Splice"
+    }}}}
 
 kcTopSpliceType :: LHsExpr Name -> TcM (LHsType Name, TcKind)
 kcTopSpliceType expr
@@ -411,7 +501,7 @@ kcTopSpliceType expr
 
        -- Rename it, but bale out if there are errors
        -- otherwise the type checker just gives more spurious errors
-       ; let doc = ptext SLIT("In the spliced type") <+> ppr hs_ty2
+       ; let doc = ptext (sLit "In the spliced type") <+> ppr hs_ty2
        ; hs_ty3 <- checkNoErrs (rnLHsType doc hs_ty2)
 
        ; kcHsType hs_ty3 }
@@ -441,13 +531,7 @@ tcSpliceDecls expr
        ; showSplice "declarations"
                     zonked_q_expr 
                     (ppr (getLoc expr) $$ (vcat (map ppr decls)))
-       ; returnM decls }
-
-  where handleErrors :: [Either a Message] -> TcM [a]
-        handleErrors [] = return []
-        handleErrors (Left x:xs) = liftM (x:) (handleErrors xs)
-        handleErrors (Right m:xs) = do addErrTc m
-                                       handleErrors xs
+       ; return decls }
 \end{code}
 
 
@@ -463,6 +547,11 @@ runMetaE :: (SrcSpan -> TH.Exp -> Either Message (LHsExpr RdrName))
         -> TcM (LHsExpr RdrName)
 runMetaE  = runMeta
 
+runMetaP :: (SrcSpan -> TH.Pat -> Either Message (Pat RdrName))
+         -> LHsExpr Id          -- Of type (Q Pat)
+         -> TcM (Pat RdrName)
+runMetaP  = runMeta
+
 runMetaT :: (SrcSpan -> TH.Type -> Either Message (LHsType RdrName))
         -> LHsExpr Id          -- Of type (Q Type)
         -> TcM (LHsType RdrName)       
@@ -482,7 +571,7 @@ runMeta convert expr
        -- Compile and link it; might fail if linking fails
        ; hsc_env <- getTopEnv
        ; src_span <- getSrcSpanM
-       ; either_hval <- tryM $ ioToTcRn $
+       ; either_hval <- tryM $ liftIO $
                         HscMain.compileExpr hsc_env src_span ds_expr
        ; case either_hval of {
            Left exn   -> failWithTc (mk_msg "compile and link" exn) ;
@@ -499,18 +588,35 @@ runMeta convert expr
                -- encounter them inside the try
                --
                -- See Note [Exceptions in TH] 
-         either_tval <- tryAllM $ do
-               { th_syn <- TH.runQ (unsafeCoerce# hval)
-               ; case convert (getLoc expr) th_syn of
+         let expr_span = getLoc expr
+       ; either_tval <- tryAllM $
+                        setSrcSpan expr_span $ -- Set the span so that qLocation can
+                                               -- see where this splice is
+            do { th_syn <- TH.runQ (unsafeCoerce# hval)
+               ; case convert expr_span th_syn of
                    Left err     -> failWithTc err
                    Right hs_syn -> return hs_syn }
 
        ; case either_tval of
            Right v -> return v
+#if __GLASGOW_HASKELL__ < 609
            Left exn | Just s <- Exception.userErrors exn
                     , s == "IOEnv failure" 
                     -> failM   -- Error already in Tc monad
                     | otherwise -> failWithTc (mk_msg "run" exn)       -- Exception
+#else
+           Left (SomeException exn) ->
+                    case cast exn of
+                    Just (ErrorCall "IOEnv failure") ->
+                        failM -- Error already in Tc monad
+                    _ ->
+                        case cast exn of
+                        Just ioe
+                         | isUserError ioe &&
+                           (ioeGetErrorString ioe == "IOEnv failure") ->
+                            failM -- Error already in Tc monad
+                        _ -> failWithTc (mk_msg "run" exn)     -- Exception
+#endif
         }}}
   where
     mk_msg s exn = vcat [text "Exception when trying to" <+> text s <+> text "compile-time code:",
@@ -560,10 +666,14 @@ instance TH.Quasi (IOEnv (Env TcGblEnv TcLclEnv)) where
   qReport True msg  = addErr (text msg)
   qReport False msg = addReport (text msg)
 
-  qCurrentModule = do { m <- getModule;
-                        return (moduleNameString (moduleName m)) }
-                -- ToDo: is throwing away the package name ok here?
-
+  qLocation = do { m <- getModule
+                ; l <- getSrcSpanM
+                ; return (TH.Loc { TH.loc_filename = unpackFS (srcSpanFile l)
+                                 , TH.loc_module   = moduleNameString (moduleName m)
+                                 , TH.loc_package  = packageIdString (modulePackageId m)
+                                 , TH.loc_start = (srcSpanStartLine l, srcSpanStartCol l)
+                                 , TH.loc_end = (srcSpanEndLine   l, srcSpanEndCol   l) }) }
+               
   qReify v = reify v
 
        -- For qRecover, discard error messages if 
@@ -576,7 +686,7 @@ instance TH.Quasi (IOEnv (Env TcGblEnv TcLclEnv)) where
                                 Nothing  -> recover                    -- Discard all msgs
                          }
 
-  qRunIO io = ioToTcRn io
+  qRunIO io = liftIO io
 \end{code}
 
 
@@ -588,18 +698,20 @@ instance TH.Quasi (IOEnv (Env TcGblEnv TcLclEnv)) where
 
 \begin{code}
 showSplice :: String -> LHsExpr Id -> SDoc -> TcM ()
-showSplice what before after
-  = getSrcSpanM                `thenM` \ loc ->
+showSplice what before after = do
+    loc <- getSrcSpanM
     traceSplice (vcat [ppr loc <> colon <+> text "Splicing" <+> text what, 
                       nest 2 (sep [nest 2 (ppr before),
                                    text "======>",
                                    nest 2 after])])
 
+illegalBracket :: ThStage -> SDoc
 illegalBracket level
-  = ptext SLIT("Illegal bracket at level") <+> ppr level
+  = ptext (sLit "Illegal bracket at level") <+> ppr level
 
+illegalSplice :: ThStage -> SDoc
 illegalSplice level
-  = ptext SLIT("Illegal splice at level") <+> ppr level
+  = ptext (sLit "Illegal splice at level") <+> ppr level
 
 #endif         /* GHCI */
 \end{code}
@@ -626,28 +738,33 @@ reify th_name
     ppr_ns (TH.Name _ (TH.NameG TH.DataName _pkg _mod)) = text "data"
     ppr_ns (TH.Name _ (TH.NameG TH.TcClsName _pkg _mod)) = text "tc"
     ppr_ns (TH.Name _ (TH.NameG TH.VarName _pkg _mod)) = text "var"
+    ppr_ns _ = panic "reify/ppr_ns"
 
 lookupThName :: TH.Name -> TcM Name
 lookupThName th_name@(TH.Name occ flavour)
-  =  do { let rdr_name = thRdrName guessed_ns occ_str flavour
-
-       -- Repeat much of lookupOccRn, becase we want
-       -- to report errors in a TH-relevant way
-       ; rdr_env <- getLocalRdrEnv
-       ; case lookupLocalRdrEnv rdr_env rdr_name of
-           Just name -> return name
-           Nothing | not (isSrcRdrName rdr_name)       -- Exact, Orig
-                   -> lookupImportedName rdr_name
-                   | otherwise                         -- Unqual, Qual
-                   -> do { mb_name <- lookupSrcOcc_maybe rdr_name
-                         ; case mb_name of
-                             Just name -> return name
-                             Nothing   -> failWithTc (notInScope th_name) }
-       }
+  =  do { mb_ns <- mapM lookup [ thRdrName gns occ_str flavour 
+                              | gns <- guessed_nss]
+       ; case catMaybes mb_ns of
+           []    -> failWithTc (notInScope th_name)
+           (n:_) -> return n } -- Pick the first that works
+                               -- E.g. reify (mkName "A") will pick the class A
+                               --      in preference to the data constructor A
   where
-       -- guessed_ns is the name space guessed from looking at the TH name
-    guessed_ns | isLexCon (mkFastString occ_str) = OccName.dataName
-              | otherwise                       = OccName.varName
+    lookup rdr_name
+       = do {  -- Repeat much of lookupOccRn, becase we want
+               -- to report errors in a TH-relevant way
+            ; rdr_env <- getLocalRdrEnv
+            ; case lookupLocalRdrEnv rdr_env rdr_name of
+                Just name -> return (Just name)
+                Nothing | not (isSrcRdrName rdr_name)  -- Exact, Orig
+                        -> do { name <- lookupImportedName rdr_name
+                              ; return (Just name) }
+                        | otherwise                    -- Unqual, Qual
+                        -> lookupSrcOcc_maybe rdr_name }
+
+       -- guessed_ns are the name spaces guessed from looking at the TH name
+    guessed_nss | isLexCon (mkFastString occ_str) = [OccName.tcName,  OccName.dataName]
+               | otherwise                       = [OccName.varName, OccName.tvName]
     occ_str = TH.occString occ
 
 tcLookupTh :: Name -> TcM TcTyThing
@@ -657,7 +774,7 @@ tcLookupTh :: Name -> TcM TcTyThing
 tcLookupTh name
   = do { (gbl_env, lcl_env) <- getEnvs
        ; case lookupNameEnv (tcl_env lcl_env) name of {
-               Just thing -> returnM thing;
+               Just thing -> return thing;
                Nothing    -> do
        { if nameIsLocalOrFrom (tcg_mod gbl_env) name
          then  -- It's defined in this module
@@ -678,12 +795,12 @@ tcLookupTh name
 
 notInScope :: TH.Name -> SDoc
 notInScope th_name = quotes (text (TH.pprint th_name)) <+> 
-                    ptext SLIT("is not in scope at a reify")
+                    ptext (sLit "is not in scope at a reify")
        -- Ugh! Rather an indirect way to display the name
 
 notInEnv :: Name -> SDoc
 notInEnv name = quotes (ppr name) <+> 
-                    ptext SLIT("is not in the type environment at a reify")
+                    ptext (sLit "is not in the type environment at a reify")
 
 ------------------------------
 reifyThing :: TcTyThing -> TcM TH.Info
@@ -697,7 +814,7 @@ reifyThing (AGlobal (AnId id))
        ; let v = reifyName id
        ; case globalIdDetails id of
            ClassOpId cls    -> return (TH.ClassOpI v ty (reifyName cls) fix)
-           other            -> return (TH.VarI     v ty Nothing fix)
+           _                -> return (TH.VarI     v ty Nothing fix)
     }
 
 reifyThing (AGlobal (ATyCon tc))  = reifyTyCon tc
@@ -720,6 +837,8 @@ reifyThing (ATyVar tv ty)
        ; ty2 <- reifyType ty1
        ; return (TH.TyVarI (reifyName tv) ty2) }
 
+reifyThing (AThing {}) = panic "reifyThing AThing"
+
 ------------------------------
 reifyTyCon :: TyCon -> TcM TH.Info
 reifyTyCon tc
@@ -761,7 +880,7 @@ reifyDataCon tys dc
          else
             return (TH.NormalC name (stricts `zip` arg_tys)) }
   | otherwise
-  = failWithTc (ptext SLIT("Can't reify a non-Haskell-98 data constructor:") 
+  = failWithTc (ptext (sLit "Can't reify a non-Haskell-98 data constructor:") 
                <+> quotes (ppr dc))
 
 ------------------------------
@@ -780,7 +899,6 @@ reifyClass cls
 reifyType :: TypeRep.Type -> TcM TH.Type
 reifyType (TyVarTy tv)     = return (TH.VarT (reifyName tv))
 reifyType (TyConApp tc tys) = reify_tc_app (reifyName tc) tys
-reifyType (NoteTy _ ty)     = reifyType ty
 reifyType (AppTy t1 t2)     = do { [r1,r2] <- reifyTypes [t1,t2] ; return (r1 `TH.AppT` r2) }
 reifyType (FunTy t1 t2)     = do { [r1,r2] <- reifyTypes [t1,t2] ; return (TH.ArrowT `TH.AppT` r1 `TH.AppT` r2) }
 reifyType ty@(ForAllTy _ _) = do { cxt' <- reifyCxt cxt; 
@@ -788,7 +906,11 @@ reifyType ty@(ForAllTy _ _) = do { cxt' <- reifyCxt cxt;
                                 ; return (TH.ForallT (reifyTyVars tvs) cxt' tau') }
                            where
                                (tvs, cxt, tau) = tcSplitSigmaTy ty
+reifyType (PredTy {}) = panic "reifyType PredTy"
+
+reifyTypes :: [Type] -> TcM [TH.Type]
 reifyTypes = mapM reifyType
+reifyCxt :: [PredType] -> TcM [TH.Type]
 reifyCxt   = mapM reifyPred
 
 reifyFunDep :: ([TyVar], [TyVar]) -> TH.FunDep
@@ -803,7 +925,8 @@ reify_tc_app tc tys = do { tys' <- reifyTypes tys
 
 reifyPred :: TypeRep.PredType -> TcM TH.Type
 reifyPred (ClassP cls tys) = reify_tc_app (reifyName cls) tys
-reifyPred p@(IParam _ _)   = noTH SLIT("implicit parameters") (ppr p)
+reifyPred p@(IParam _ _)   = noTH (sLit "implicit parameters") (ppr p)
+reifyPred (EqPred {})      = panic "reifyPred EqPred"
 
 
 ------------------------------
@@ -817,7 +940,7 @@ reifyName thing
        -- have free variables, we may need to generate NameL's for them.
   where
     name    = getName thing
-    mod     = nameModule name
+    mod     = ASSERT( isExternalName name ) nameModule name
     pkg_str = packageIdString (modulePackageId mod)
     mod_str = moduleNameString (moduleName mod)
     occ_str = occNameString occ
@@ -845,7 +968,7 @@ reifyStrict NotMarkedStrict = TH.NotStrict
 
 ------------------------------
 noTH :: LitString -> SDoc -> TcM a
-noTH s d = failWithTc (hsep [ptext SLIT("Can't represent") <+> ptext s <+> 
-                               ptext SLIT("in Template Haskell:"),
+noTH s d = failWithTc (hsep [ptext (sLit "Can't represent") <+> ptext s <+> 
+                               ptext (sLit "in Template Haskell:"),
                             nest 2 d])
 \end{code}