X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=a3c292b82368ab392ef43638917fcc3a37f0480c;hb=e921b2e307532e0f30eefa88b11a124be592bde4;hp=6fe697ba590b246f1c620306797232326e350e5b;hpb=f7989a6dea8c43352f363117d9bb07439953ccdc;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 6fe697b..a3c292b 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -12,7 +12,7 @@ import HsSyn ( HsDecl(..), DefaultDecl(..) ) import RnHsSyn ( RenamedHsDecl ) import TcMonad -import TcEnv ( tcLookupClassByKey ) +import TcEnv ( tcLookupClassByKey_maybe ) import TcMonoType ( tcHsType ) import TcSimplify ( tcSimplifyCheckThetas ) @@ -25,7 +25,7 @@ import Util \end{code} \begin{code} -default_default = [integerTy, doubleTy ] +default_default = [integerTy, doubleTy] tcDefaults :: [RenamedHsDecl] -> TcM s [Type] -- defaulting types to heave @@ -35,24 +35,33 @@ tcDefaults decls = tc_defaults [default_decl | DefD default_decl <- decls] tc_defaults [] = returnTc default_default +tc_defaults [DefaultDecl [] locn] + = returnTc [] -- no defaults + tc_defaults [DefaultDecl mono_tys locn] - = tcAddSrcLoc locn $ + = tcLookupClassByKey_maybe numClassKey `thenNF_Tc` \ maybe_num -> + case maybe_num of { + Nothing -> -- Num has not been sucked in, so the defaults will + -- never be used; so simply discard the default decl. + -- This slightly benefits modules that don't use any + -- numeric stuff at all, by avoid the necessity of + -- always sucking in Num + returnTc [] ; + + Just num -> -- The common case + + tcAddSrcLoc locn $ mapTc tcHsType mono_tys `thenTc` \ tau_tys -> - case tau_tys of - [] -> returnTc [] -- no defaults - - _ -> -- Check that all the types are instances of Num -- We only care about whether it worked or not - - tcAddErrCtxt defaultDeclCtxt $ - tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> - tcSimplifyCheckThetas + tcAddErrCtxt defaultDeclCtxt $ + tcSimplifyCheckThetas [{- Nothing given -}] [ (num, [ty]) | ty <- tau_tys ] `thenTc_` - returnTc tau_tys + returnTc tau_tys + } tc_defaults decls@(DefaultDecl _ loc : _) = tcAddSrcLoc loc $ @@ -69,3 +78,4 @@ dupDefaultDeclErr (DefaultDecl _ locn1 : dup_things) where pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn \end{code} +