X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcDefaults.lhs;h=6067ea8934588e3738cfd7530a40b89beefd5657;hb=49c84dec1a5612852fb0f484e7dd3be0c99636f4;hp=b9b74c3cd0f4d318c63d26658323eda6a6d3f3bd;hpb=087fdd53c7d6bb6cb17574133abc2de4f1816c7e;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcDefaults.lhs b/ghc/compiler/typecheck/TcDefaults.lhs index b9b74c3..6067ea8 100644 --- a/ghc/compiler/typecheck/TcDefaults.lhs +++ b/ghc/compiler/typecheck/TcDefaults.lhs @@ -4,7 +4,7 @@ \section[TcDefaults]{Typechecking \tr{default} declarations} \begin{code} -module TcDefaults ( tcDefaults ) where +module TcDefaults ( tcDefaults, defaultDefaultTys ) where #include "HsVersions.h" @@ -14,17 +14,17 @@ import RnHsSyn ( RenamedHsDecl ) import TcMonad import TcEnv ( tcLookupGlobal_maybe ) import TcMonoType ( tcHsType ) -import TcSimplify ( tcSimplifyCheckThetas ) +import TcSimplify ( tcSimplifyDefault ) import TysWiredIn ( integerTy, doubleTy ) -import Type ( Type ) +import TcType ( Type, mkClassPred, isTauTy ) import PrelNames ( numClassName ) import Outputable import HscTypes ( TyThing(..) ) \end{code} \begin{code} -default_default = [integerTy, doubleTy] +defaultDefaultTys = [integerTy, doubleTy] tcDefaults :: [RenamedHsDecl] -> TcM [Type] -- defaulting types to heave @@ -32,7 +32,7 @@ tcDefaults :: [RenamedHsDecl] -- in Disambig. tcDefaults decls = tc_defaults [default_decl | DefD default_decl <- decls] -tc_defaults [] = returnTc default_default +tc_defaults [] = returnTc defaultDefaultTys tc_defaults [DefaultDecl [] locn] = returnTc [] -- no defaults @@ -49,24 +49,26 @@ tc_defaults [DefaultDecl mono_tys locn] -- always sucking in Num where common_case num_class - = tcAddSrcLoc locn $ - mapTc tcHsType mono_tys `thenTc` \ tau_tys -> + = tcAddSrcLoc locn $ + tcAddErrCtxt defaultDeclCtxt $ + mapTc tc_default_ty 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_` + tcSimplifyDefault [mkClassPred num_class [ty] | ty <- tau_tys] `thenTc_` returnTc tau_tys - tc_defaults decls@(DefaultDecl _ loc : _) = tcAddSrcLoc loc $ failWithTc (dupDefaultDeclErr decls) +tc_default_ty hs_ty + = tcHsType hs_ty `thenTc` \ ty -> + checkTc (isTauTy ty) (polyDefErr hs_ty) `thenTc_` + returnTc ty + defaultDeclCtxt = ptext SLIT("when checking that each type in a default declaration") $$ ptext SLIT("is an instance of class Num") @@ -76,5 +78,8 @@ dupDefaultDeclErr (DefaultDecl _ locn1 : dup_things) 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}