X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=7335631009c7fa672eb03c2c4a05eec1ae5ac919;hb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;hp=0296080e8aa8679c9d627b6677be4303c4f74213;hpb=ca5a4a480d10d61e5b7a52eb4d556e8b8c33e69d;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index 0296080..7335631 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -1,43 +1,43 @@ % -% (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 TcMonad import TcEnv ( tcLookupClassByKey ) -import TcMonoType ( tcMonoType ) +import TcMonoType ( tcHsType ) import TcSimplify ( tcSimplifyCheckThetas ) -import PrelInfo ( intTy, doubleTy, unitTy ) +import TysWiredIn ( intTy, doubleTy ) +import Type ( Type ) import Unique ( numClassKey ) +import ErrUtils ( addShortErrLocLine ) +import Outputable import Util \end{code} \begin{code} -tcDefaults :: [RenamedDefaultDecl] +default_default = [intTy, doubleTy] -- language-specified default `default' + +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] -tcDefaults [] - = returnTc [intTy, doubleTy] -- language-specified default `default' +tc_defaults [] = returnTc default_default -tcDefaults [DefaultDecl mono_tys locn] +tc_defaults [DefaultDecl mono_tys locn] = tcAddSrcLoc locn $ - mapTc tcMonoType mono_tys `thenTc` \ tau_tys -> + mapTc tcHsType mono_tys `thenTc` \ tau_tys -> case tau_tys of [] -> returnTc [] -- no defaults @@ -46,10 +46,28 @@ tcDefaults [DefaultDecl mono_tys locn] -- 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` \ _ -> + tcAddErrCtxt defaultDeclCtxt $ + tcLookupClassByKey numClassKey `thenNF_Tc` \ num -> + tcSimplifyCheckThetas + [{- Nothing given -}] + [ (num, [ty]) | ty <- tau_tys ] `thenTc_` returnTc tau_tys +tc_defaults decls + = failWithTc (dupDefaultDeclErr decls) + + +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) + = vcat (item1 : map dup_item dup_things) + where + item1 + = addShortErrLocLine locn1 (ptext SLIT("multiple default declarations")) + + dup_item (DefaultDecl _ locn) + = addShortErrLocLine locn (ptext SLIT("here was another default declaration")) \end{code}