X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=a3c292b82368ab392ef43638917fcc3a37f0480c;hb=495ef8bd9ef30bffe50ea399b91e3ba09646b59a;hp=7335631009c7fa672eb03c2c4a05eec1ae5ac919;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 7335631..a3c292b 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -12,11 +12,11 @@ import HsSyn ( HsDecl(..), DefaultDecl(..) ) import RnHsSyn ( RenamedHsDecl ) import TcMonad -import TcEnv ( tcLookupClassByKey ) +import TcEnv ( tcLookupClassByKey_maybe ) import TcMonoType ( tcHsType ) import TcSimplify ( tcSimplifyCheckThetas ) -import TysWiredIn ( intTy, doubleTy ) +import TysWiredIn ( integerTy, doubleTy ) import Type ( Type ) import Unique ( numClassKey ) import ErrUtils ( addShortErrLocLine ) @@ -25,7 +25,7 @@ import Util \end{code} \begin{code} -default_default = [intTy, doubleTy] -- language-specified default `default' +default_default = [integerTy, doubleTy] tcDefaults :: [RenamedHsDecl] -> TcM s [Type] -- defaulting types to heave @@ -35,27 +35,37 @@ 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 - = failWithTc (dupDefaultDeclErr decls) +tc_defaults decls@(DefaultDecl _ loc : _) = + tcAddSrcLoc loc $ + failWithTc (dupDefaultDeclErr decls) defaultDeclCtxt = ptext SLIT("when checking that each type in a default declaration") @@ -63,11 +73,9 @@ defaultDeclCtxt = ptext SLIT("when checking that each type in a default declara dupDefaultDeclErr (DefaultDecl _ locn1 : dup_things) - = vcat (item1 : map dup_item dup_things) + = hang (ptext SLIT("Multiple default declarations")) + 4 (vcat (map pp dup_things)) where - item1 - = addShortErrLocLine locn1 (ptext SLIT("multiple default declarations")) - - dup_item (DefaultDecl _ locn) - = addShortErrLocLine locn (ptext SLIT("here was another default declaration")) + pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn \end{code} +