X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcDefaults.lhs;h=50b5767cef93614c00d88330f39d0e26931392bb;hp=0011215fe6e1fbc9b0fbd41d9854df635aff6172;hb=HEAD;hpb=49c98d143c382a1341e1046f5ca00819a25691ba diff --git a/compiler/typecheck/TcDefaults.lhs b/compiler/typecheck/TcDefaults.lhs index 0011215..50b5767 100644 --- a/compiler/typecheck/TcDefaults.lhs +++ b/compiler/typecheck/TcDefaults.lhs @@ -7,18 +7,20 @@ \begin{code} module TcDefaults ( tcDefaults ) where -#include "HsVersions.h" - import HsSyn import Name +import Class import TcRnMonad 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} @@ -28,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) @@ -39,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}