Move error-ids to MkCore (from PrelRules)
[ghc-hetmet.git] / compiler / typecheck / TcTyClsDecls.lhs
index 47b8c31..f009637 100644 (file)
@@ -7,7 +7,7 @@ TcTyClsDecls: Typecheck type and class declarations
 
 \begin{code}
 module TcTyClsDecls (
-       tcTyAndClassDecls, tcFamInstDecl, mkAuxBinds
+       tcTyAndClassDecls, tcFamInstDecl, mkRecSelBinds
     ) where
 
 #include "HsVersions.h"
@@ -30,7 +30,8 @@ import Class
 import TyCon
 import DataCon
 import Id
-import MkId            ( rEC_SEL_ERROR_ID )
+import MkId            ( mkDefaultMethodId )
+import MkCore          ( rEC_SEL_ERROR_ID )
 import IdInfo
 import Var
 import VarSet
@@ -136,7 +137,9 @@ indeed type families).  I think.
 tcTyAndClassDecls :: ModDetails -> [LTyClDecl Name]
                   -> TcM (TcGblEnv,         -- Input env extended by types and classes 
                                             -- and their implicit Ids,DataCons
-                          HsValBinds Name)  -- Renamed bindings for record selectors
+                          HsValBinds Name,  -- Renamed bindings for record selectors
+                          [Id])             -- Default method ids
+
 -- Fails if there are any errors
 
 tcTyAndClassDecls boot_details allDecls
@@ -150,7 +153,7 @@ tcTyAndClassDecls boot_details allDecls
                -- See notes with checkCycleErrs
        ; checkCycleErrs decls
        ; mod <- getModule
-       ; traceTc (text "tcTyAndCl" <+> ppr mod)
+       ; traceTc "tcTyAndCl" (ppr mod)
        ; (syn_tycons, alg_tyclss) <- fixM (\ ~(_rec_syn_tycons, rec_alg_tyclss) ->
          do    { let { -- Seperate ordinary synonyms from all other type and
                        -- class declarations and add all associated type
@@ -191,9 +194,9 @@ tcTyAndClassDecls boot_details allDecls
        ; tcExtendGlobalEnv (syn_tycons ++ alg_tyclss) $ do
 
        -- Perform the validity check
-       { traceTc (text "ready for validity check")
+       { traceTc "ready for validity check" empty
        ; mapM_ (addLocM checkValidTyCl) decls
-       ; traceTc (text "done")
+       ; traceTc "done" empty
    
        -- Add the implicit things;
        -- we want them in the environment because 
@@ -202,11 +205,13 @@ tcTyAndClassDecls boot_details allDecls
        --     second time here.  This doesn't matter as the definitions are
        --     the same.
        ; let { implicit_things = concatMap implicitTyThings alg_tyclss
-             ; aux_binds       = mkAuxBinds alg_tyclss }
-       ; traceTc ((text "Adding" <+> ppr alg_tyclss) 
-                  $$ (text "and" <+> ppr implicit_things))
+             ; rec_sel_binds   = mkRecSelBinds alg_tyclss
+              ; dm_ids          = mkDefaultMethodIds alg_tyclss }
+       ; traceTc "Adding types and classes" $ vcat
+                 [ ppr alg_tyclss 
+                , text "and" <+> ppr implicit_things ]
        ; env <- tcExtendGlobalEnv implicit_things getGblEnv
-       ; return (env, aux_binds) }
+       ; return (env, rec_sel_binds, dm_ids) }
     }
   where
     -- Pull associated types out of class declarations, to tie them into the
@@ -244,8 +249,8 @@ lot of kinding and type checking code with ordinary algebraic data types (and
 GADTs).
 
 \begin{code}
-tcFamInstDecl :: LTyClDecl Name -> TcM TyThing
-tcFamInstDecl (L loc decl)
+tcFamInstDecl :: TopLevelFlag -> LTyClDecl Name -> TcM TyThing
+tcFamInstDecl top_lvl (L loc decl)
   =    -- Prime error recovery, set source location
     setSrcSpan loc                             $
     tcAddDeclCtxt decl                         $
@@ -260,15 +265,33 @@ tcFamInstDecl (L loc decl)
        ; tc <- tcFamInstDecl1 decl
        ; checkValidTyCon tc    -- Remember to check validity;
                                -- no recursion to worry about here
+
+       -- Check that toplevel type instances are not for associated types.
+       ; when (isTopLevel top_lvl && isAssocFamily tc)
+              (addErr $ assocInClassErr (tcdName decl))
+
        ; return (ATyCon tc) }
 
+isAssocFamily :: TyCon -> Bool -- Is an assocaited type
+isAssocFamily tycon
+  = case tyConFamInst_maybe tycon of
+          Nothing       -> panic "isAssocFamily: no family?!?"
+          Just (fam, _) -> isTyConAssoc fam
+
+assocInClassErr :: Name -> SDoc
+assocInClassErr name
+ = ptext (sLit "Associated type") <+> quotes (ppr name) <+>
+   ptext (sLit "must be inside a class instance")
+
+
+
 tcFamInstDecl1 :: TyClDecl Name -> TcM TyCon
 
   -- "type instance"
 tcFamInstDecl1 (decl@TySynonym {tcdLName = L loc tc_name})
   = kcIdxTyPats decl $ \k_tvs k_typats resKind family ->
     do { -- check that the family declaration is for a synonym
-         checkTc (isOpenTyCon family) (notFamily family)
+         checkTc (isFamilyTyCon family) (notFamily family)
        ; checkTc (isSynTyCon family) (wrongKindOfFamily family)
 
        ; -- (1) kind check the right-hand side of the type equation
@@ -292,7 +315,8 @@ tcFamInstDecl1 (decl@TySynonym {tcdLName = L loc tc_name})
          -- (4) construct representation tycon
        ; rep_tc_name <- newFamInstTyConName tc_name t_typats loc
        ; buildSynTyCon rep_tc_name t_tvs (SynonymTyCon t_rhs) 
-                       (typeKind t_rhs) (Just (family, t_typats))
+                       (typeKind t_rhs) 
+                       NoParentTyCon (Just (family, t_typats))
        }}
 
   -- "newtype instance" and "data instance"
@@ -300,7 +324,7 @@ tcFamInstDecl1 (decl@TyData {tcdND = new_or_data, tcdLName = L loc tc_name,
                             tcdCons = cons})
   = kcIdxTyPats decl $ \k_tvs k_typats resKind fam_tycon ->
     do { -- check that the family declaration is for the right kind
-         checkTc (isOpenTyCon fam_tycon) (notFamily fam_tycon)
+         checkTc (isFamilyTyCon fam_tycon) (notFamily fam_tycon)
        ; checkTc (isAlgTyCon fam_tycon) (wrongKindOfFamily fam_tycon)
 
        ; -- (1) kind check the data declaration as usual
@@ -346,7 +370,7 @@ tcFamInstDecl1 (decl@TyData {tcdND = new_or_data, tcdLName = L loc tc_name,
                   NewType  -> ASSERT( not (null data_cons) )
                               mkNewTyConRhs rep_tc_name rep_tycon (head data_cons)
             ; buildAlgTyCon rep_tc_name t_tvs stupid_theta tc_rhs Recursive
-                            False h98_syntax (Just (fam_tycon, t_typats))
+                            False h98_syntax NoParentTyCon (Just (fam_tycon, t_typats))
                  -- We always assume that indexed types are recursive.  Why?
                  -- (1) Due to their open nature, we can never be sure that a
                  -- further instance might not introduce a new recursive
@@ -509,10 +533,10 @@ kcSynDecl :: SCC (LTyClDecl Name)
 kcSynDecl (AcyclicSCC (L loc decl))
   = tcAddDeclCtxt decl $
     kcHsTyVars (tcdTyVars decl) (\ k_tvs ->
-    do { traceTc (text "kcd1" <+> ppr (unLoc (tcdLName decl)) <+> brackets (ppr (tcdTyVars decl)) 
+    do { traceTc "kcd1" (ppr (unLoc (tcdLName decl)) <+> brackets (ppr (tcdTyVars decl)) 
                        <+> brackets (ppr k_tvs))
        ; (k_rhs, rhs_kind) <- kcLHsType (tcdSynRhs decl)
-       ; traceTc (text "kcd2" <+> ppr (unLoc (tcdLName decl)))
+       ; traceTc "kcd2" (ppr (unLoc (tcdLName decl)))
        ; let tc_kind = foldr (mkArrowKind . hsTyVarKind . unLoc) rhs_kind k_tvs
        ; return (L loc (decl { tcdTyVars = k_tvs, tcdSynRhs = k_rhs }),
                 (unLoc (tcdLName decl), tc_kind)) })
@@ -663,10 +687,10 @@ tcSynDecl :: TyClDecl Name -> TcM TyThing
 tcSynDecl
   (TySynonym {tcdLName = L _ tc_name, tcdTyVars = tvs, tcdSynRhs = rhs_ty})
   = tcTyVarBndrs tvs           $ \ tvs' -> do 
-    { traceTc (text "tcd1" <+> ppr tc_name) 
+    { traceTc "tcd1" (ppr tc_name) 
     ; rhs_ty' <- tcHsKindedType rhs_ty
     ; tycon <- buildSynTyCon tc_name tvs' (SynonymTyCon rhs_ty') 
-                            (typeKind rhs_ty') Nothing
+                            (typeKind rhs_ty') NoParentTyCon  Nothing
     ; return (ATyCon tycon) 
     }
 tcSynDecl d = pprPanic "tcSynDecl" (ppr d)
@@ -675,31 +699,31 @@ tcSynDecl d = pprPanic "tcSynDecl" (ppr d)
 tcTyClDecl :: (Name -> RecFlag) -> TyClDecl Name -> TcM [TyThing]
 
 tcTyClDecl calc_isrec decl
-  = tcAddDeclCtxt decl (tcTyClDecl1 calc_isrec decl)
+  = tcAddDeclCtxt decl (tcTyClDecl1 NoParentTyCon calc_isrec decl)
 
   -- "type family" declarations
-tcTyClDecl1 :: (Name -> RecFlag) -> TyClDecl Name -> TcM [TyThing]
-tcTyClDecl1 _calc_isrec 
+tcTyClDecl1 :: TyConParent -> (Name -> RecFlag) -> TyClDecl Name -> TcM [TyThing]
+tcTyClDecl1 parent _calc_isrec 
   (TyFamily {tcdFlavour = TypeFamily, 
             tcdLName = L _ tc_name, tcdTyVars = tvs,
              tcdKind = Just kind}) -- NB: kind at latest added during kind checking
   = tcTyVarBndrs tvs  $ \ tvs' -> do 
-  { traceTc (text "type family: " <+> ppr tc_name) 
+  { traceTc "type family:" (ppr tc_name) 
 
        -- Check that we don't use families without -XTypeFamilies
   ; idx_tys <- doptM Opt_TypeFamilies
   ; checkTc idx_tys $ badFamInstDecl tc_name
 
-  ; tycon <- buildSynTyCon tc_name tvs' (OpenSynTyCon kind Nothing) kind Nothing
+  ; tycon <- buildSynTyCon tc_name tvs' SynFamilyTyCon kind parent Nothing
   ; return [ATyCon tycon]
   }
 
   -- "data family" declaration
-tcTyClDecl1 _calc_isrec 
+tcTyClDecl1 parent _calc_isrec 
   (TyFamily {tcdFlavour = DataFamily, 
             tcdLName = L _ tc_name, tcdTyVars = tvs, tcdKind = mb_kind})
   = tcTyVarBndrs tvs  $ \ tvs' -> do 
-  { traceTc (text "data family: " <+> ppr tc_name) 
+  { traceTc "data family:" (ppr tc_name) 
   ; extra_tvs <- tcDataKindSig mb_kind
   ; let final_tvs = tvs' ++ extra_tvs    -- we may not need these
 
@@ -709,13 +733,14 @@ tcTyClDecl1 _calc_isrec
   ; checkTc idx_tys $ badFamInstDecl tc_name
 
   ; tycon <- buildAlgTyCon tc_name final_tvs [] 
-              mkOpenDataTyConRhs Recursive False True Nothing
+               DataFamilyTyCon Recursive False True 
+               parent Nothing
   ; return [ATyCon tycon]
   }
 
   -- "newtype" and "data"
   -- NB: not used for newtype/data instances (whether associated or not)
-tcTyClDecl1 calc_isrec
+tcTyClDecl1 parent calc_isrec
   (TyData {tcdND = new_or_data, tcdCtxt = ctxt, tcdTyVars = tvs,
           tcdLName = L _ tc_name, tcdKindSig = mb_ksig, tcdCons = cons})
   = tcTyVarBndrs tvs   $ \ tvs' -> do 
@@ -763,7 +788,8 @@ tcTyClDecl1 calc_isrec
                   NewType  -> ASSERT( not (null data_cons) )
                                mkNewTyConRhs tc_name tycon (head data_cons)
        ; buildAlgTyCon tc_name final_tvs stupid_theta tc_rhs is_rec
-           (want_generic && canDoGenerics data_cons) h98_syntax Nothing
+           (want_generic && canDoGenerics data_cons) (not h98_syntax) 
+            parent Nothing
        })
   ; return [ATyCon tycon]
   }
@@ -771,29 +797,27 @@ tcTyClDecl1 calc_isrec
     is_rec   = calc_isrec tc_name
     h98_syntax = consUseH98Syntax cons
 
-tcTyClDecl1 calc_isrec 
+tcTyClDecl1 _parent calc_isrec 
   (ClassDecl {tcdLName = L _ class_name, tcdTyVars = tvs, 
              tcdCtxt = ctxt, tcdMeths = meths,
              tcdFDs = fundeps, tcdSigs = sigs, tcdATs = ats} )
   = tcTyVarBndrs tvs           $ \ tvs' -> do 
   { ctxt' <- tcHsKindedContext ctxt
   ; fds' <- mapM (addLocM tc_fundep) fundeps
-  ; atss <- mapM (addLocM (tcTyClDecl1 (const Recursive))) ats
-            -- NB: 'ats' only contains "type family" and "data family"
-            --     declarations as well as type family defaults
-  ; let ats' = map (setAssocFamilyPermutation tvs') (concat atss)
   ; sig_stuff <- tcClassSigs class_name sigs meths
-  ; clas <- fixM (\ clas ->
-               let     -- This little knot is just so we can get
+  ; clas <- fixM $ \ clas -> do
+           { let       -- This little knot is just so we can get
                        -- hold of the name of the class TyCon, which we
                        -- need to look up its recursiveness
                    tycon_name = tyConName (classTyCon clas)
                    tc_isrec = calc_isrec tycon_name
-               in
-               buildClass False {- Must include unfoldings for selectors -}
-                          class_name tvs' ctxt' fds' ats'
-                          sig_stuff tc_isrec)
-  ; return (AClass clas : ats')
+           ; atss' <- mapM (addLocM $ tcTyClDecl1 (AssocFamilyTyCon clas) (const Recursive)) ats
+            -- NB: 'ats' only contains "type family" and "data family"
+            --     declarations as well as type family defaults
+            ; buildClass False {- Must include unfoldings for selectors -}
+                        class_name tvs' ctxt' fds' (concat atss')
+                        sig_stuff tc_isrec }
+  ; return (AClass clas : map ATyCon (classATs clas))
       -- NB: Order is important due to the call to `mkGlobalThings' when
       --     tying the the type and class declaration type checking knot.
   }
@@ -802,11 +826,11 @@ tcTyClDecl1 calc_isrec
                                ; tvs2' <- mapM tcLookupTyVar tvs2 ;
                                ; return (tvs1', tvs2') }
 
-tcTyClDecl1 _
+tcTyClDecl1 _ _
   (ForeignType {tcdLName = L _ tc_name, tcdExtName = tc_ext_name})
   = return [ATyCon (mkForeignTyCon tc_name tc_ext_name liftedTypeKind 0)]
 
-tcTyClDecl1 _ d = pprPanic "tcTyClDecl1" (ppr d)
+tcTyClDecl1 _ _ d = pprPanic "tcTyClDecl1" (ppr d)
 
 -----------------------------------
 tcConDecls :: Bool -> Bool -> TyCon -> ([TyVar], Type)
@@ -1015,12 +1039,12 @@ checkValidTyCl :: TyClDecl Name -> TcM ()
 checkValidTyCl decl
   = tcAddDeclCtxt decl $
     do { thing <- tcLookupLocatedGlobal (tcdLName decl)
-       ; traceTc (text "Validity of" <+> ppr thing)    
+       ; traceTc "Validity of" (ppr thing)     
        ; case thing of
            ATyCon tc -> checkValidTyCon tc
            AClass cl -> checkValidClass cl 
             _ -> panic "checkValidTyCl"
-       ; traceTc (text "Done validity of" <+> ppr thing)       
+       ; traceTc "Done validity of" (ppr thing)        
        }
 
 -------------------------
@@ -1042,8 +1066,8 @@ checkValidTyCon :: TyCon -> TcM ()
 checkValidTyCon tc 
   | isSynTyCon tc 
   = case synTyConRhs tc of
-      OpenSynTyCon _ _ -> return ()
-      SynonymTyCon ty  -> checkValidType syn_ctxt ty
+      SynFamilyTyCon {} -> return ()
+      SynonymTyCon ty   -> checkValidType syn_ctxt ty
   | otherwise
   = do -- Check the context on the data decl
     checkValidTheta (DataTyCtxt name) (tyConStupidTheta tc)
@@ -1113,7 +1137,7 @@ checkValidDataCon :: TyCon -> DataCon -> TcM ()
 checkValidDataCon tc con
   = setSrcSpan (srcLocSpan (getSrcLoc con))    $
     addErrCtxt (dataConCtxt con)               $ 
-    do { traceTc (ptext (sLit "Validity of data con") <+> ppr con)
+    do { traceTc "Validity of data con" (ppr con)
         ; let tc_tvs = tyConTyVars tc
              res_ty_tmpl = mkFamilyTyConApp tc (mkTyVarTys tc_tvs)
              actual_res_ty = dataConOrigResTy con
@@ -1187,7 +1211,7 @@ checkValidClass cls
                -- The 'tail' removes the initial (C a) from the
                -- class itself, leaving just the method type
 
-       ; traceTc (text "class op type" <+> ppr op_ty <+> ppr tau)
+       ; traceTc "class op type" (ppr op_ty <+> ppr tau)
        ; checkValidType (FunSigCtxt op_name) tau
 
                -- Check that the type mentions at least one of
@@ -1228,11 +1252,36 @@ checkValidClass cls
 %************************************************************************
 
 \begin{code}
-mkAuxBinds :: [TyThing] -> HsValBinds Name
+mkDefaultMethodIds :: [TyThing] -> [Id]
+-- See Note [Default method Ids and Template Haskell]
+mkDefaultMethodIds things
+  = [ mkDefaultMethodId sel_id dm_name
+    | AClass cls <- things
+    , (sel_id, DefMeth dm_name) <- classOpItems cls ]
+\end{code}
+
+Note [Default method Ids and Template Haskell]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Consider this (Trac #4169):
+   class Numeric a where
+     fromIntegerNum :: a
+     fromIntegerNum = ...
+
+   ast :: Q [Dec]
+   ast = [d| instance Numeric Int |]
+
+When we typecheck 'ast' we have done the first pass over the class decl
+(in tcTyClDecls), but we have not yet typechecked the default-method
+declarations (becuase they can mention value declarations).  So we 
+must bring the default method Ids into scope first (so they can be seen
+when typechecking the [d| .. |] quote, and typecheck them later.
+
+\begin{code}
+mkRecSelBinds :: [TyThing] -> HsValBinds Name
 -- NB We produce *un-typechecked* bindings, rather like 'deriving'
 --    This makes life easier, because the later type checking will add
 --    all necessary type abstractions and applications
-mkAuxBinds ty_things
+mkRecSelBinds ty_things
   = ValBindsOut [(NonRecursive, b) | b <- binds] sigs
   where
     (sigs, binds) = unzip rec_sels
@@ -1447,7 +1496,7 @@ genericMultiParamErr clas
 badGenericMethodType :: Name -> Kind -> SDoc
 badGenericMethodType op op_ty
   = hang (ptext (sLit "Generic method type is too complex"))
-       4 (vcat [ppr op <+> dcolon <+> ppr op_ty,
+       2 (vcat [ppr op <+> dcolon <+> ppr op_ty,
                ptext (sLit "You can only use type variables, arrows, lists, and tuples")])
 
 recSynErr :: [LTyClDecl Name] -> TcRn ()