X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=b9b74c3cd0f4d318c63d26658323eda6a6d3f3bd;hb=d4e2c3a1d02169cdbd71577a3189d94a158e806b;hp=5ea9905e609e7ad5b003843279e17d485cb4b68c;hpb=6c381e873e222417d9a67aeec77b9555eca7b7a8;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 5ea9905..b9b74c3 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -1,55 +1,80 @@ % -% (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 -import Inst ( InstOrigin(..) ) -import TcEnv ( tcLookupClassByKey ) -import TcMonoType ( tcMonoType ) +import TcEnv ( tcLookupGlobal_maybe ) +import TcMonoType ( tcHsType ) import TcSimplify ( tcSimplifyCheckThetas ) -import PrelInfo ( intTy, doubleTy, unitTy ) -import Unique ( numClassKey ) -import Util +import TysWiredIn ( integerTy, doubleTy ) +import Type ( Type ) +import PrelNames ( numClassName ) +import Outputable +import HscTypes ( TyThing(..) ) \end{code} \begin{code} -tcDefaults :: [RenamedDefaultDecl] - -> TcM s [Type] -- defaulting types to heave +default_default = [integerTy, doubleTy] + +tcDefaults :: [RenamedHsDecl] + -> TcM [Type] -- defaulting types to heave -- into Tc monad for later use -- in Disambig. +tcDefaults decls = tc_defaults [default_decl | DefD default_decl <- decls] -tcDefaults [] - = returnTc [intTy, doubleTy] -- language-specified default `default' +tc_defaults [] = returnTc default_default -tcDefaults [DefaultDecl mono_tys locn] - = tcAddSrcLoc locn $ - mapTc tcMonoType mono_tys `thenTc` \ tau_tys -> +tc_defaults [DefaultDecl [] locn] + = returnTc [] -- no defaults - case tau_tys of - [] -> returnTc [] -- no defaults +tc_defaults [DefaultDecl mono_tys locn] + = tcLookupGlobal_maybe numClassName `thenNF_Tc` \ maybe_num -> + case maybe_num of + Just (AClass num_class) -> common_case num_class + other -> returnTc [] + -- 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 + = 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_class, [ty]) | ty <- tau_tys ] `thenTc_` + + returnTc tau_tys - _ -> - -- Check that all the types are instances of Num - -- We only care about whether it worked or not - tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> - tcSimplifyCheckThetas DefaultDeclOrigin - [ (num, ty) | ty <- tau_tys ] `thenTc` \ _ -> +tc_defaults decls@(DefaultDecl _ loc : _) = + tcAddSrcLoc loc $ + failWithTc (dupDefaultDeclErr decls) - 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} +