X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=ef9ff7901a86187744d85492af22ae066cef56e6;hb=9af77fa423926fbda946b31e174173d0ec5ebac8;hp=7335631009c7fa672eb03c2c4a05eec1ae5ac919;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 7335631..ef9ff79 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -11,63 +11,71 @@ module TcDefaults ( tcDefaults ) where import HsSyn ( HsDecl(..), DefaultDecl(..) ) import RnHsSyn ( RenamedHsDecl ) -import TcMonad -import TcEnv ( tcLookupClassByKey ) +import TcRnMonad +import TcEnv ( tcLookupGlobal_maybe ) import TcMonoType ( tcHsType ) -import TcSimplify ( tcSimplifyCheckThetas ) - -import TysWiredIn ( intTy, doubleTy ) -import Type ( Type ) -import Unique ( numClassKey ) -import ErrUtils ( addShortErrLocLine ) +import TcSimplify ( tcSimplifyDefault ) +import TcType ( Type, mkClassPred, isTauTy ) +import PrelNames ( numClassName ) import Outputable -import Util +import HscTypes ( TyThing(..) ) \end{code} \begin{code} -default_default = [intTy, doubleTy] -- language-specified default `default' - tcDefaults :: [RenamedHsDecl] - -> TcM s [Type] -- defaulting types to heave + -> TcM [Type] -- defaulting types to heave -- into Tc monad for later use -- in Disambig. tcDefaults decls = tc_defaults [default_decl | DefD default_decl <- decls] -tc_defaults [] = returnTc default_default - -tc_defaults [DefaultDecl mono_tys locn] - = 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 +tc_defaults [] = returnM defaultDefaultTys - tcAddErrCtxt defaultDeclCtxt $ - tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> - tcSimplifyCheckThetas - [{- Nothing given -}] - [ (num, [ty]) | ty <- tau_tys ] `thenTc_` - - returnTc tau_tys - -tc_defaults decls - = failWithTc (dupDefaultDeclErr decls) +tc_defaults [DefaultDecl [] locn] + = returnM [] -- no defaults +tc_defaults [DefaultDecl mono_tys locn] + = tcLookupGlobal_maybe numClassName `thenM` \ maybe_num -> + case maybe_num of + Just (AClass num_class) -> common_case num_class + other -> returnM [] + -- In the Nothing case, 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 + where + common_case num_class + = addSrcLoc locn $ + addErrCtxt defaultDeclCtxt $ + 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_` + + returnM tau_tys + +tc_defaults decls@(DefaultDecl _ loc : _) = + addSrcLoc loc $ + failWithTc (dupDefaultDeclErr decls) + + +tc_default_ty hs_ty + = tcHsType hs_ty `thenM` \ ty -> + checkTc (isTauTy ty) (polyDefErr hs_ty) `thenM_` + returnM ty defaultDeclCtxt = ptext SLIT("when checking that each type in a default declaration") $$ ptext SLIT("is an instance of class Num") 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")) + pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn - dup_item (DefaultDecl _ locn) - = addShortErrLocLine locn (ptext SLIT("here was another default declaration")) +polyDefErr ty + = hang (ptext SLIT("Illegal polymorphic type in default declaration") <> colon) 4 (ppr ty) \end{code} +