X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=f10745121ea95a93f894910d7d4763fb1e77be29;hb=a465e8bda2a03163fa45976c531307faeea76490;hp=b28b07db9a695d8f73c3d00f6aff57ec2384a8fb;hpb=e5ed694b59d3f4debdf86ab44e656568ecec39c9;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index b28b07d..f107451 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -4,44 +4,48 @@ \section[TcDefaults]{Typechecking \tr{default} declarations} \begin{code} -module TcDefaults ( tcDefaults, defaultDefaultTys ) where +module TcDefaults ( tcDefaults ) where #include "HsVersions.h" -import HsSyn ( HsDecl(..), DefaultDecl(..) ) -import RnHsSyn ( RenamedHsDecl ) - -import TcMonad +import HsSyn ( DefaultDecl(..) ) +import Name ( Name ) +import TcRnMonad import TcEnv ( tcLookupGlobal_maybe ) import TcMonoType ( tcHsType ) -import TcSimplify ( tcSimplifyCheckThetas ) - -import TysWiredIn ( integerTy, doubleTy ) -import Type ( Type ) +import TcSimplify ( tcSimplifyDefault ) +import TcType ( Type, mkClassPred, isTauTy ) import PrelNames ( numClassName ) import Outputable import HscTypes ( TyThing(..) ) \end{code} \begin{code} -defaultDefaultTys = [integerTy, doubleTy] - -tcDefaults :: [RenamedHsDecl] - -> TcM [Type] -- defaulting types to heave +tcDefaults :: [DefaultDecl Name] + -> 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 defaultDefaultTys -tc_defaults [DefaultDecl [] locn] - = returnTc [] -- no defaults - -tc_defaults [DefaultDecl mono_tys locn] - = tcLookupGlobal_maybe numClassName `thenNF_Tc` \ maybe_num -> +tcDefaults [] + = getDefaultTys -- No default declaration, so get the + -- default types from the envt; + -- i.e. use the curent ones + -- (the caller will put them back there) + -- It's important not to return defaultDefaultTys here (which + -- we used to do) because in a TH program, tcDefaults [] is called + -- repeatedly, once for each group of declarations between top-level + -- splices. We don't want to carefully set the default types in + -- one group, only for the next group to ignore them and install + -- defaultDefaultTys + +tcDefaults [DefaultDecl [] locn] + = returnM [] -- Default declaration specifying no types + +tcDefaults [DefaultDecl mono_tys locn] + = tcLookupGlobal_maybe numClassName `thenM` \ maybe_num -> case maybe_num of Just (AClass num_class) -> common_case num_class - other -> returnTc [] + 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 @@ -49,24 +53,26 @@ tc_defaults [DefaultDecl mono_tys locn] -- always sucking in Num where common_case num_class - = tcAddSrcLoc locn $ - mapTc tcHsType mono_tys `thenTc` \ tau_tys -> + = 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 - tcAddErrCtxt defaultDeclCtxt $ - tcSimplifyCheckThetas - [{- Nothing given -}] - [ (num_class, [ty]) | ty <- tau_tys ] `thenTc_` + tcSimplifyDefault [mkClassPred num_class [ty] | ty <- tau_tys] `thenM_` - returnTc tau_tys - + returnM tau_tys -tc_defaults decls@(DefaultDecl _ loc : _) = - tcAddSrcLoc loc $ +tcDefaults 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") @@ -76,5 +82,8 @@ dupDefaultDeclErr (DefaultDecl _ locn1 : dup_things) 4 (vcat (map pp dup_things)) where pp (DefaultDecl _ locn) = ptext SLIT("here was another default declaration") <+> ppr locn + +polyDefErr ty + = hang (ptext SLIT("Illegal polymorphic type in default declaration") <> colon) 4 (ppr ty) \end{code}