X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=82290dbe4643f8011183136a4d99b1dd91fbdeef;hb=ac04a368e76592978fde8cc1881312f3d5db8d79;hp=811f04b6ad4c20312c938a15846c8ece7b178472;hpb=e7d21ee4f8ac907665a7e170c71d59e13a01da09;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 811f04b..82290db 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -1,67 +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 TcMonad -import AbsSyn +#include "HsVersions.h" -import AbsPrel ( intTy, doubleTy, unitTy ) -import AbsUniType ( UniType - IF_ATTACK_PRAGMAS(COMMA cmpUniType) - ) -import CE ( lookupCE, CE(..) ) -import E -import Inst -import Name -import TcMonoType ( tcMonoType ) -import TcSimplify ( tcSimplifyCheckThetas ) -import TVE -import Unique ( numClassKey, Unique ) -import Util +import HsSyn ( DefaultDecl(..) ) +import Name ( Name ) +import TcRnMonad +import TcEnv ( tcLookupGlobal_maybe ) +import TcMonoType ( tcHsType ) +import TcSimplify ( tcSimplifyDefault ) +import TcType ( Type, mkClassPred, isTauTy ) +import PrelNames ( numClassName ) +import Outputable +import HscTypes ( TyThing(..) ) \end{code} \begin{code} -tcDefaults :: E - -> [RenamedDefaultDecl] - -> TcM [UniType] -- defaulting types to heave +tcDefaults :: [DefaultDecl Name] + -> TcM [Type] -- defaulting types to heave -- into Tc monad for later use -- in Disambig. -tcDefaults _ [] - = returnTc [intTy, doubleTy] -- language-specified default `default' +tcDefaults [] = returnM defaultDefaultTys -tcDefaults e [DefaultDecl mono_tys locn] - = let - ce = getE_CE e - tce = getE_TCE e - tve = nullTVE +tcDefaults [DefaultDecl [] locn] + = returnM [] -- no defaults - num_clas = lookupCE ce (PreludeClass numClassKey (panic "tcDefaults")) - in - babyTcMtoTcM (mapB_Tc (tcMonoType ce tce tve) mono_tys) `thenTc` \ tau_tys -> +tcDefaults [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 - -- compensate for extreme parser hack: `default ()' actually - -- sends the *type* () through to here. Squash it. - case tau_tys of - [ty] | ty == unitTy -> returnTc [] +tcDefaults decls@(DefaultDecl _ loc : _) = + addSrcLoc loc $ + failWithTc (dupDefaultDeclErr decls) - _ -> -- (Back to your regularly scheduled programming...) - -- Check that all the types are instances of Num +tc_default_ty hs_ty + = tcHsType hs_ty `thenM` \ ty -> + checkTc (isTauTy ty) (polyDefErr hs_ty) `thenM_` + returnM ty - tcSimplifyCheckThetas (DefaultDeclOrigin locn) - [ (num_clas, ty) | ty <- tau_tys ] `thenTc` \ _ -> - -- We only care about whether it worked or not +defaultDeclCtxt = ptext SLIT("when checking that each type in a default declaration") + $$ ptext SLIT("is an instance of class Num") - returnTc tau_tys -- caller will bung them into Tc monad -tcDefaults _ (_:_) - = error "ERROR: You can only have one `default' declaration per module." - -- ToDo: proper error msg. +dupDefaultDeclErr (DefaultDecl _ locn1 : dup_things) + = hang (ptext SLIT("Multiple default declarations")) + 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} +