fix haddock submodule pointer
[ghc-hetmet.git] / compiler / typecheck / TcDefaults.lhs
index 6c9de36..50b5767 100644 (file)
@@ -1,4 +1,5 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The AQUA Project, Glasgow University, 1993-1998
 %
 \section[TcDefaults]{Typechecking \tr{default} declarations}
@@ -6,18 +7,20 @@
 \begin{code}
 module TcDefaults ( tcDefaults ) where
 
-#include "HsVersions.h"
-
-import HsSyn           ( DefaultDecl(..), LDefaultDecl )
-import Name            ( Name )
+import HsSyn
+import Name
+import Class
 import TcRnMonad
-import TcEnv           ( tcLookupClass )
-import TcHsType                ( tcHsSigType, UserTypeCtxt( DefaultDeclCtxt ) )
-import TcSimplify      ( tcSimplifyDefault )
-import TcType           ( Type, mkClassPred, isTauTy )
-import PrelNames       ( numClassName )
-import SrcLoc          ( Located(..) )
+import TcEnv
+import TcHsType
+import TcSimplify
+import TcType
+import PrelNames
+import DynFlags
+import SrcLoc
+import Data.Maybe
 import Outputable
+import FastString
 \end{code}
 
 \begin{code}
@@ -27,7 +30,7 @@ tcDefaults :: [LDefaultDecl Name]
                                    -- in Disambig.
 
 tcDefaults [] 
-  = getDefaultTys              -- No default declaration, so get the
+  = getDeclaredDefaultTys      -- No default declaration, so get the
                                -- default types from the envt; 
                                -- i.e. use the curent ones
                                -- (the caller will put them back there)
@@ -38,42 +41,62 @@ tcDefaults []
        -- one group, only for the next group to ignore them and install
        -- defaultDefaultTys
 
-tcDefaults [L locn (DefaultDecl [])]
-  = returnM (Just [])          -- Default declaration specifying no types
+tcDefaults [L _ (DefaultDecl [])]
+  = return (Just [])           -- Default declaration specifying no types
 
 tcDefaults [L locn (DefaultDecl mono_tys)]
   = setSrcSpan locn                    $
     addErrCtxt defaultDeclCtxt         $
-    tcLookupClass numClassName         `thenM` \ num_class ->
-    mappM tc_default_ty mono_tys       `thenM` \ tau_tys ->
-    
-       -- Check that all the types are instances of Num
-       -- We only care about whether it worked or not
-    tcSimplifyDefault [mkClassPred num_class [ty] | ty <- tau_tys]     `thenM_`
+    do { ovl_str <- xoptM Opt_OverloadedStrings
+       ; num_class    <- tcLookupClass numClassName
+       ; is_str_class <- tcLookupClass isStringClassName
+       ; let deflt_clss | ovl_str   = [num_class, is_str_class]
+                        | otherwise = [num_class]
+
+       ; tau_tys <- mapM (tc_default_ty deflt_clss) mono_tys
     
-    returnM (Just tau_tys)
+       ; return (Just tau_tys) }
 
-tcDefaults decls@(L locn (DefaultDecl _) : _) =
-    setSrcSpan locn $
+tcDefaults decls@(L locn (DefaultDecl _) : _)
+  = setSrcSpan locn $
     failWithTc (dupDefaultDeclErr decls)
 
 
-tc_default_ty hs_ty 
- = tcHsSigType DefaultDeclCtxt hs_ty           `thenM` \ ty ->
-   checkTc (isTauTy ty) (polyDefErr hs_ty)     `thenM_`
-   returnM ty
+tc_default_ty :: [Class] -> LHsType Name -> TcM Type
+tc_default_ty deflt_clss hs_ty 
+ = do  { ty <- tcHsSigType DefaultDeclCtxt hs_ty
+       ; checkTc (isTauTy ty) (polyDefErr hs_ty)
 
-defaultDeclCtxt =  ptext SLIT("when checking that each type in a default declaration")
-                   $$ ptext SLIT("is an instance of class Num")
+       -- Check that the type is an instance of at least one of the deflt_clss
+       ; oks <- mapM (check_instance ty) deflt_clss
+       ; checkTc (or oks) (badDefaultTy ty deflt_clss)
+       ; return ty }
 
+check_instance :: Type -> Class -> TcM Bool
+  -- Check that ty is an instance of cls
+  -- We only care about whether it worked or not; return a boolean
+check_instance ty cls
+  = do { (_, mb_res) <- tryTc (simplifyDefault [mkClassPred cls [ty]])
+       ; return (isJust mb_res) }
+    
+defaultDeclCtxt :: SDoc
+defaultDeclCtxt = ptext (sLit "When checking the types in a default declaration")
 
+dupDefaultDeclErr :: [Located (DefaultDecl Name)] -> SDoc
 dupDefaultDeclErr (L _ (DefaultDecl _) : dup_things)
-  = hang (ptext SLIT("Multiple default declarations"))
-      4  (vcat (map pp dup_things))
+  = hang (ptext (sLit "Multiple default declarations"))
+       2 (vcat (map pp dup_things))
   where
-    pp (L locn (DefaultDecl _)) = ptext SLIT("here was another default declaration") <+> ppr locn
+    pp (L locn (DefaultDecl _)) = ptext (sLit "here was another default declaration") <+> ppr locn
+dupDefaultDeclErr [] = panic "dupDefaultDeclErr []"
 
+polyDefErr :: LHsType Name -> SDoc
 polyDefErr ty 
-  = hang (ptext SLIT("Illegal polymorphic type in default declaration") <> colon) 4 (ppr ty) 
+  = hang (ptext (sLit "Illegal polymorphic type in default declaration") <> colon) 2 (ppr ty) 
+
+badDefaultTy :: Type -> [Class] -> SDoc
+badDefaultTy ty deflt_clss
+  = hang (ptext (sLit "The default type") <+> quotes (ppr ty) <+> ptext (sLit "is not an instance of"))
+       2 (foldr1 (\a b -> a <+> ptext (sLit "or") <+> b) (map (quotes. ppr) deflt_clss))
 \end{code}