X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=6c9de36a3c099979b3336f97596373b9c94847b7;hb=7434eae33776ba56eae28dfd85172dd86d180be2;hp=0296080e8aa8679c9d627b6677be4303c4f74213;hpb=ca5a4a480d10d61e5b7a52eb4d556e8b8c33e69d;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 0296080..6c9de36 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -1,55 +1,79 @@ % -% (c) The AQUA Project, Glasgow University, 1993-1995 +% (c) The AQUA Project, Glasgow University, 1993-1998 % \section[TcDefaults]{Typechecking \tr{default} declarations} \begin{code} -#include "HsVersions.h" - module TcDefaults ( tcDefaults ) where -import Ubiq - -import HsSyn ( DefaultDecl(..), MonoType, - HsExpr, HsLit, ArithSeqInfo, Fake, InPat) -import RnHsSyn ( RenamedDefaultDecl(..) ) -import TcHsSyn ( TcIdOcc ) - -import TcMonad hiding ( rnMtoTcM ) -import Inst ( InstOrigin(..) ) -import TcEnv ( tcLookupClassByKey ) -import TcMonoType ( tcMonoType ) -import TcSimplify ( tcSimplifyCheckThetas ) +#include "HsVersions.h" -import PrelInfo ( intTy, doubleTy, unitTy ) -import Unique ( numClassKey ) -import Util +import HsSyn ( DefaultDecl(..), LDefaultDecl ) +import Name ( Name ) +import TcRnMonad +import TcEnv ( tcLookupClass ) +import TcHsType ( tcHsSigType, UserTypeCtxt( DefaultDeclCtxt ) ) +import TcSimplify ( tcSimplifyDefault ) +import TcType ( Type, mkClassPred, isTauTy ) +import PrelNames ( numClassName ) +import SrcLoc ( Located(..) ) +import Outputable \end{code} \begin{code} -tcDefaults :: [RenamedDefaultDecl] - -> TcM s [Type] -- defaulting types to heave +tcDefaults :: [LDefaultDecl Name] + -> TcM (Maybe [Type]) -- Defaulting types to heave -- into Tc monad for later use -- in Disambig. -tcDefaults [] - = returnTc [intTy, doubleTy] -- language-specified default `default' +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 mono_tys locn] - = tcAddSrcLoc locn $ - mapTc tcMonoType mono_tys `thenTc` \ tau_tys -> +tcDefaults [L locn (DefaultDecl [])] + = returnM (Just []) -- Default declaration specifying no types - case tau_tys of - [] -> returnTc [] -- no defaults +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_` + + returnM (Just tau_tys) - _ -> - -- Check that all the types are instances of Num - -- We only care about whether it worked or not +tcDefaults decls@(L locn (DefaultDecl _) : _) = + setSrcSpan locn $ + failWithTc (dupDefaultDeclErr decls) - tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> - tcSimplifyCheckThetas DefaultDeclOrigin - [ (num, ty) | ty <- tau_tys ] `thenTc` \ _ -> - returnTc tau_tys +tc_default_ty hs_ty + = tcHsSigType DefaultDeclCtxt 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 (L _ (DefaultDecl _) : dup_things) + = hang (ptext SLIT("Multiple default declarations")) + 4 (vcat (map pp dup_things)) + where + pp (L locn (DefaultDecl _)) = 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} +