X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=a3c292b82368ab392ef43638917fcc3a37f0480c;hb=e921b2e307532e0f30eefa88b11a124be592bde4;hp=0296080e8aa8679c9d627b6677be4303c4f74213;hpb=ca5a4a480d10d61e5b7a52eb4d556e8b8c33e69d;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 0296080..a3c292b 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -1,55 +1,81 @@ % -% (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 +#include "HsVersions.h" -import HsSyn ( DefaultDecl(..), MonoType, - HsExpr, HsLit, ArithSeqInfo, Fake, InPat) -import RnHsSyn ( RenamedDefaultDecl(..) ) -import TcHsSyn ( TcIdOcc ) +import HsSyn ( HsDecl(..), DefaultDecl(..) ) +import RnHsSyn ( RenamedHsDecl ) -import TcMonad hiding ( rnMtoTcM ) -import Inst ( InstOrigin(..) ) -import TcEnv ( tcLookupClassByKey ) -import TcMonoType ( tcMonoType ) +import TcMonad +import TcEnv ( tcLookupClassByKey_maybe ) +import TcMonoType ( tcHsType ) import TcSimplify ( tcSimplifyCheckThetas ) -import PrelInfo ( intTy, doubleTy, unitTy ) +import TysWiredIn ( integerTy, doubleTy ) +import Type ( Type ) import Unique ( numClassKey ) +import ErrUtils ( addShortErrLocLine ) +import Outputable import Util \end{code} \begin{code} -tcDefaults :: [RenamedDefaultDecl] +default_default = [integerTy, doubleTy] + +tcDefaults :: [RenamedHsDecl] -> TcM s [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 -tcDefaults [] - = returnTc [intTy, doubleTy] -- language-specified default `default' +tc_defaults [DefaultDecl [] locn] + = returnTc [] -- no defaults -tcDefaults [DefaultDecl mono_tys locn] - = tcAddSrcLoc locn $ - mapTc tcMonoType mono_tys `thenTc` \ tau_tys -> +tc_defaults [DefaultDecl mono_tys 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 [] ; - case tau_tys of - [] -> returnTc [] -- no defaults + Just num -> -- The common case + + tcAddSrcLoc locn $ + mapTc tcHsType mono_tys `thenTc` \ 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, [ty]) | ty <- tau_tys ] `thenTc_` + + returnTc tau_tys + } + +tc_defaults decls@(DefaultDecl _ loc : _) = + tcAddSrcLoc loc $ + failWithTc (dupDefaultDeclErr decls) - tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> - tcSimplifyCheckThetas DefaultDeclOrigin - [ (num, ty) | ty <- tau_tys ] `thenTc` \ _ -> - returnTc tau_tys +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) + = 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 \end{code} +