X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcInstDcls.lhs;h=2a9570355549de54f27bb556687c34bce89399fc;hb=4166dff80e8ec94022a040318ff2759913fbbe06;hp=5bdec504517bbaf8e23ea3e00b28d9e680d7b126;hpb=348639a37fdc4da2b12fb07c5819176bb1d5f098;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcInstDcls.lhs b/ghc/compiler/typecheck/TcInstDcls.lhs index 5bdec50..2a95703 100644 --- a/ghc/compiler/typecheck/TcInstDcls.lhs +++ b/ghc/compiler/typecheck/TcInstDcls.lhs @@ -9,74 +9,72 @@ module TcInstDcls ( tcInstDecls1, tcInstDecls2, tcAddDeclCtxt ) where #include "HsVersions.h" -import CmdLineOpts ( opt_GlasgowExts, opt_AllowUndecidableInstances, opt_D_dump_deriv ) +import CmdLineOpts ( DynFlag(..), dopt ) -import HsSyn ( HsDecl(..), InstDecl(..), TyClDecl(..), - MonoBinds(..), HsExpr(..), HsLit(..), Sig(..), +import HsSyn ( HsDecl(..), InstDecl(..), TyClDecl(..), + MonoBinds(..), HsExpr(..), HsLit(..), Sig(..), andMonoBindList, collectMonoBinders, isClassDecl ) -import HsTypes ( HsType (..), HsTyVarBndr(..), toHsTyVar ) -import HsPat ( InPat (..) ) -import HsMatches ( Match (..) ) -import RnHsSyn ( RenamedHsBinds, RenamedInstDecl, RenamedHsDecl, extractHsTyVars ) +import RnHsSyn ( RenamedHsBinds, RenamedInstDecl, RenamedHsDecl, RenamedMonoBinds, + RenamedTyClDecl, RenamedHsType, + extractHsTyVars, maybeGenericMatch + ) import TcHsSyn ( TcMonoBinds, mkHsConApp ) import TcBinds ( tcSpecSigs ) import TcClassDcl ( tcMethodBind, badMethodErr ) import TcMonad -import RnMonad ( RnNameSupply, FixityEnv ) import Inst ( InstOrigin(..), newDicts, newClassDicts, LIE, emptyLIE, plusLIE, plusLIEs ) import TcDeriv ( tcDeriving ) -import TcEnv ( ValueEnv, tcExtendGlobalValEnv, - tcExtendTyVarEnvForMeths, TyThing (..), +import TcEnv ( TcEnv, tcExtendGlobalValEnv, + tcExtendTyVarEnvForMeths, tcAddImportedIdInfo, tcInstId, tcLookupClass, + InstInfo(..), pprInstInfo, simpleInstInfoTyCon, simpleInstInfoTy, newDFunName, tcExtendTyVarEnv ) -import TcInstUtil ( InstInfo(..), pprInstInfo, classDataCon, simpleInstInfoTyCon, simpleInstInfoTy ) -import TcMonoType ( tcTyVars, tcHsSigType, tcHsType, kcHsSigType ) +import InstEnv ( InstEnv, extendInstEnv ) +import TcMonoType ( tcTyVars, tcHsSigType, kcHsSigType ) import TcSimplify ( tcSimplifyAndCheck ) import TcType ( zonkTcSigTyVars ) - -import Bag ( emptyBag, unitBag, unionBags, unionManyBags, - foldBag, Bag, listToBag +import HscTypes ( HomeSymbolTable, DFunId, + ModDetails(..), PackageInstEnv, PersistentRenamerState ) + +import Bag ( unionManyBags ) +import DataCon ( classDataCon ) import Class ( Class, DefMeth(..), classBigSig ) import Var ( idName, idType ) -import Maybes ( maybeToBool, expectJust ) +import Maybes ( maybeToBool ) import MkId ( mkDictFunId ) import Generics ( validGenericInstanceType ) -import Module ( Module ) -import Name ( isLocallyDefined ) +import Module ( Module, foldModuleEnv ) +import Name ( getSrcLoc ) import NameSet ( emptyNameSet, nameSetToList ) import PrelInfo ( eRROR_ID ) import PprType ( pprConstraint, pprPred ) -import TyCon ( isSynTyCon, tyConDerivings ) -import Type ( mkTyVarTys, splitSigmaTy, isTyVarTy, - splitTyConApp_maybe, splitDictTy_maybe, - splitAlgTyConApp_maybe, classesToPreds, classesOfPreds, - unUsgTy, tyVarsOfTypes, mkClassPred, mkTyVarTy, +import TyCon ( TyCon, isSynTyCon ) +import Type ( splitDFunTy, isTyVarTy, + splitTyConApp_maybe, splitDictTy, + splitForAllTys, + tyVarsOfTypes, mkClassPred, mkTyVarTy, getClassTys_maybe ) -import Subst ( mkTopTyVarSubst, substClasses, substTheta ) +import Subst ( mkTopTyVarSubst, substClasses ) import VarSet ( mkVarSet, varSetElems ) import TysWiredIn ( genericTyCons, isFFIArgumentTy, isFFIResultTy ) import PrelNames ( cCallableClassKey, cReturnableClassKey, hasKey ) -import Name ( Name, NameEnv, extendNameEnv_C, emptyNameEnv, - plusNameEnv_C, nameEnvElts ) -import FiniteMap ( mapFM ) +import Name ( Name ) import SrcLoc ( SrcLoc ) -import RnHsSyn -- ( RenamedMonoBinds ) import VarSet ( varSetElems ) -import UniqFM ( mapUFM ) import Unique ( Uniquable(..) ) -import BasicTypes ( NewOrData(..) ) -import ErrUtils ( dumpIfSet ) +import BasicTypes ( NewOrData(..), Fixity ) +import ErrUtils ( dumpIfSet_dyn ) import ListSetOps ( Assoc, emptyAssoc, plusAssoc_C, mapAssoc, assocElts, extendAssoc_C, equivClassesByUniq, minusList ) -import List ( intersect, (\\) ) +import List ( partition ) import Outputable \end{code} @@ -163,25 +161,28 @@ and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm. Gather up the instance declarations from their various sources \begin{code} -tcInstDecls1 :: PersistentCompilerState +tcInstDecls1 :: PackageInstEnv + -> PersistentRenamerState -> HomeSymbolTable -- Contains instances -> TcEnv -- Contains IdInfo for dfun ids + -> (Name -> Maybe Fixity) -- for deriving Show and Read -> Module -- Module for deriving -> [RenamedHsDecl] - -> TcM (PersistentCompilerState, InstEnv, [InstInfo], RenamedHsBinds) + -> TcM (PackageInstEnv, InstEnv, [InstInfo], RenamedHsBinds) -tcInstDecls1 pcs hst unf_env this_mod decls mod +tcInstDecls1 inst_env0 prs hst unf_env get_fixity mod decls = let - inst_decls = [inst_decl | InstD inst_decl <- decls] - clas_decls = [clas_decl | TyClD clas_decl <- decls, isClassDecl cl_decl] + inst_decls = [inst_decl | InstD inst_decl <- decls] + tycl_decls = [decl | TyClD decl <- decls] + clas_decls = filter isClassDecl tycl_decls in -- (1) Do the ordinary instance declarations - mapNF_Tc (tcInstDecl1 mod) inst_decls `thenNF_Tc` \ inst_infos -> + mapNF_Tc (tcInstDecl1 mod unf_env) inst_decls `thenNF_Tc` \ inst_infos -> -- (2) Instances from generic class declarations - getGenericInstances mod clas_decls `thenTc` \ generic_inst_info -> + getGenericInstances mod clas_decls `thenTc` \ generic_inst_info -> - -- Next, consruct the instance environment so far, consisting of + -- Next, construct the instance environment so far, consisting of -- a) cached non-home-package InstEnv (gotten from pcs) pcs_insts pcs -- b) imported instance decls (not in the home package) inst_env1 -- c) other modules in this package (gotten from hst) inst_env2 @@ -189,44 +190,45 @@ tcInstDecls1 pcs hst unf_env this_mod decls mod -- e) generic instances inst_env4 -- The result of (b) replaces the cached InstEnv in the PCS let - (local_inst_info, imported_inst_info) = partition isLocalInst (concat inst_infos) - generic_inst_info = concat generic_inst_infos -- All local + (local_inst_info, imported_inst_info) = partition iLocal (concat inst_infos) - imported_dfuns = map (tcAddImportedIdInfo unf_env . instInfoDFun) imported_inst_info + imported_dfuns = map (tcAddImportedIdInfo unf_env . iDFunId) + imported_inst_info hst_dfuns = foldModuleEnv ((++) . md_insts) [] hst in - addInstDFuns (pcs_insts pcs) imported_dfuns `thenNF_Tc` \ inst_env1 -> + addInstDFuns inst_env0 imported_dfuns `thenNF_Tc` \ inst_env1 -> addInstDFuns inst_env1 hst_dfuns `thenNF_Tc` \ inst_env2 -> addInstInfos inst_env2 local_inst_info `thenNF_Tc` \ inst_env3 -> addInstInfos inst_env3 generic_inst_info `thenNF_Tc` \ inst_env4 -> - in -- (3) Compute instances from "deriving" clauses; -- note that we only do derivings for things in this module; -- we ignore deriving decls from interfaces! -- This stuff computes a context for the derived instance decl, so it -- needs to know about all the instances possible; hecne inst_env4 - tcDeriving (pcs_PRS pcs) this_mod inst_env4 local_tycons `thenTc` \ (deriv_inst_info, deriv_binds) -> - addInstInfos inst_env4 deriv_inst_info `thenNF_Tc` \ final_inst_env -> + tcDeriving prs mod inst_env4 get_fixity tycl_decls `thenTc` \ (deriv_inst_info, deriv_binds) -> + addInstInfos inst_env4 deriv_inst_info `thenNF_Tc` \ final_inst_env -> - returnTc (pcs { pcs_insts = inst_env1 }, + returnTc (inst_env1, final_inst_env, generic_inst_info ++ deriv_inst_info ++ local_inst_info, deriv_binds) addInstInfos :: InstEnv -> [InstInfo] -> NF_TcM InstEnv -addInstInfos inst_env infos = addInstDfuns inst_env (map iDFun infos) +addInstInfos inst_env infos = addInstDFuns inst_env (map iDFunId infos) addInstDFuns :: InstEnv -> [DFunId] -> NF_TcM InstEnv addInstDFuns dfuns infos - = addErrsTc errs `thenNF_Tc_` + = getDOptsTc `thenTc` \ dflags -> + let + (inst_env', errs) = extendInstEnv dflags dfuns infos + in + addErrsTc errs `thenNF_Tc_` returnTc inst_env' - where - (inst_env', errs) = extendInstEnv env dfuns \end{code} \begin{code} -tcInstDecl1 :: Module -> ValueEnv -> RenamedInstDecl -> NF_TcM [InstInfo] +tcInstDecl1 :: Module -> TcEnv -> RenamedInstDecl -> NF_TcM [InstInfo] -- Deal with a single instance declaration tcInstDecl1 mod unf_env (InstDecl poly_ty binds uprags maybe_dfun_name src_loc) = -- Prime error recovery, set source location @@ -236,10 +238,7 @@ tcInstDecl1 mod unf_env (InstDecl poly_ty binds uprags maybe_dfun_name src_loc) -- Type-check all the stuff before the "where" tcHsSigType poly_ty `thenTc` \ poly_ty' -> let - (tyvars, theta, dict_ty) = splitSigmaTy poly_ty' - (clas, inst_tys) = case splitDictTy_maybe dict_ty of - Just ct -> ct - Nothing -> pprPanic "tcInstDecl1" (ppr poly_ty) + (tyvars, theta, clas, inst_tys) = splitDFunTy poly_ty' in (case maybe_dfun_name of @@ -255,17 +254,18 @@ tcInstDecl1 mod unf_env (InstDecl poly_ty binds uprags maybe_dfun_name src_loc) -- Make the dfun id and return it newDFunName mod clas inst_tys src_loc `thenNF_Tc` \ dfun_name -> - returnNF_Tc (True, mkDictFunId dfun_name clas tyvars inst_tys theta) + returnNF_Tc (True, dfun_name) Just dfun_name -> -- An interface-file instance declaration -- Make the dfun id - returnNF_Tc (False, mkDictFunId dfun_name clas tyvars inst_tys theta) - ) `thenNF_Tc` \ (is_local, dfun_id) -> + returnNF_Tc (False, dfun_name) + ) `thenNF_Tc` \ (is_local, dfun_name) -> - returnTc [InstInfo { iLocal = is_local, - iClass = clas, iTyVars = tyvars, iTys = inst_tys, - iTheta = theta, iDFunId = dfun_id, - iBinds = binds, iLoc = src_loc, iPrags = uprags }] + let + dfun_id = mkDictFunId dfun_name clas tyvars inst_tys theta + in + returnTc [InstInfo { iLocal = is_local, iDFunId = dfun_id, + iBinds = binds, iPrags = uprags }] \end{code} @@ -302,16 +302,18 @@ gives rise to the instance declarations \begin{code} getGenericInstances :: Module -> [RenamedTyClDecl] -> TcM [InstInfo] getGenericInstances mod class_decls - = mapTc (get_generics mod) class_decls `thenTc` \ gen_inst_infos -> + = mapTc (get_generics mod) class_decls `thenTc` \ gen_inst_infos -> let gen_inst_info = concat gen_inst_infos in - ioToTc (dumpIfSet opt_D_dump_deriv "Generic instances" - (vcat (map pprInstInfo gen_inst_info))) `thenNF_Tc_` + getDOptsTc `thenTc` \ dflags -> + ioToTc (dumpIfSet_dyn dflags Opt_D_dump_deriv "Generic instances" + (vcat (map pprInstInfo gen_inst_info))) + `thenNF_Tc_` returnTc gen_inst_info get_generics mod decl@(ClassDecl context class_name tyvar_names - fundeps class_sigs def_methods pragmas + fundeps class_sigs def_methods name_list loc) | null groups = returnTc [] -- The comon case: @@ -332,15 +334,18 @@ get_generics mod decl@(ClassDecl context class_name tyvar_names -- f {| x+y |} ... = ... -- Then at this point we'll have an InstInfo for each let - bad_groups = [group | group <- equivClassesByUniq get_uniq inst_infos, + tc_inst_infos :: [(TyCon, InstInfo)] + tc_inst_infos = [(simpleInstInfoTyCon i, i) | i <- inst_infos] + + bad_groups = [group | group <- equivClassesByUniq get_uniq tc_inst_infos, length group > 1] - get_uniq inst = getUnique (simpleInstInfoTyCon inst) + get_uniq (tc,_) = getUnique tc in mapTc (addErrTc . dupGenericInsts) bad_groups `thenTc_` -- Check that there is an InstInfo for each generic type constructor let - missing = genericTyCons `minusList` map simpleInstInfoTyCon inst_infos + missing = genericTyCons `minusList` [tc | (tc,_) <- tc_inst_infos] in checkTc (null missing) (missingGenericInstances missing) `thenTc_` @@ -362,9 +367,11 @@ getGenericBinds (AndMonoBinds m1 m2) = plusAssoc_C AndMonoBinds (getGenericBinds m1) (getGenericBinds m2) getGenericBinds (FunMonoBind id infixop matches loc) - = mapAssoc wrap (foldr add emptyAssoc matches) + = mapAssoc wrap (foldl add emptyAssoc matches) + -- Using foldl not foldr is vital, else + -- we reverse the order of the bindings! where - add match env = case maybeGenericMatch match of + add env match = case maybeGenericMatch match of Nothing -> env Just (ty, match') -> extendAssoc_C (++) env (ty, [match']) @@ -397,10 +404,8 @@ mkGenericInstance mod clas loc (hs_ty, binds) dfun_id = mkDictFunId dfun_name clas tyvars inst_tys inst_theta in - returnTc (InstInfo { iLocal = True, - iClass = clas, iTyVars = tyvars, iTys = inst_tys, - iTheta = inst_theta, iDFunId = dfun_id, iBinds = binds, - iLoc = loc, iPrags = [] }) + returnTc (InstInfo { iLocal = True, iDFunId = dfun_id, + iBinds = binds, iPrags = [] }) \end{code} @@ -411,11 +416,13 @@ mkGenericInstance mod clas loc (hs_ty, binds) %************************************************************************ \begin{code} -tcInstDecls2 :: Bag InstInfo +tcInstDecls2 :: [InstInfo] -> NF_TcM (LIE, TcMonoBinds) tcInstDecls2 inst_decls - = foldBag combine tcInstDecl2 (returnNF_Tc (emptyLIE, EmptyMonoBinds)) inst_decls +-- = foldBag combine tcInstDecl2 (returnNF_Tc (emptyLIE, EmptyMonoBinds)) inst_decls + = foldr combine (returnNF_Tc (emptyLIE, EmptyMonoBinds)) + (map tcInstDecl2 inst_decls) where combine tc1 tc2 = tc1 `thenNF_Tc` \ (lie1, binds1) -> tc2 `thenNF_Tc` \ (lie2, binds2) -> @@ -492,21 +499,20 @@ First comes the easy case of a non-local instance decl. \begin{code} tcInstDecl2 :: InstInfo -> NF_TcM (LIE, TcMonoBinds) -tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, - iTheta = inst_decl_theta, iDFunId = dfun_id, - iBinds = monobinds, iLoc = locn, iPrags = uprags }) - | not (isLocallyDefined dfun_id) +tcInstDecl2 (InstInfo { iLocal = is_local, iDFunId = dfun_id, + iBinds = monobinds, iPrags = uprags }) + | not is_local = returnNF_Tc (emptyLIE, EmptyMonoBinds) | otherwise = -- Prime error recovery recoverNF_Tc (returnNF_Tc (emptyLIE, EmptyMonoBinds)) $ - tcAddSrcLoc locn $ + tcAddSrcLoc (getSrcLoc dfun_id) $ -- Instantiate the instance decl with tc-style type variables tcInstId dfun_id `thenNF_Tc` \ (inst_tyvars', dfun_theta', dict_ty') -> let - (clas, inst_tys') = expectJust "tcInstDecl2" (splitDictTy_maybe dict_ty') + (clas, inst_tys') = splitDictTy dict_ty' origin = InstanceDeclOrigin (class_tyvars, sc_theta, _, op_items) = classBigSig clas @@ -514,15 +520,16 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, dm_ids = [dm_id | (_, DefMeth dm_id) <- op_items] sel_names = [idName sel_id | (sel_id, _) <- op_items] - -- Instantiate the theta found in the original instance decl - inst_decl_theta' = substTheta (mkTopTyVarSubst inst_tyvars (mkTyVarTys inst_tyvars')) - inst_decl_theta - -- Instantiate the super-class context with inst_tys sc_theta' = substClasses (mkTopTyVarSubst class_tyvars inst_tys') sc_theta -- Find any definitions in monobinds that aren't from the class bad_bndrs = collectMonoBinders monobinds `minusList` sel_names + + -- The type variable from the dict fun actually scope + -- over the bindings. They were gotten from + -- the original instance declaration + (inst_tyvars, _) = splitForAllTys (idType dfun_id) in -- Check that all the method bindings come from this class mapTc (addErrTc . badMethodErr clas) bad_bndrs `thenNF_Tc_` @@ -530,7 +537,6 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, -- Create dictionary Ids from the specified instance contexts. newClassDicts origin sc_theta' `thenNF_Tc` \ (sc_dicts, sc_dict_ids) -> newDicts origin dfun_theta' `thenNF_Tc` \ (dfun_arg_dicts, dfun_arg_dicts_ids) -> - newDicts origin inst_decl_theta' `thenNF_Tc` \ (inst_decl_dicts, _) -> newClassDicts origin [(clas,inst_tys')] `thenNF_Tc` \ (this_dict, [this_dict_id]) -> tcExtendTyVarEnvForMeths inst_tyvars inst_tyvars' ( @@ -538,7 +544,7 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, -- Default-method Ids may be mentioned in synthesised RHSs mapAndUnzip3Tc (tcMethodBind clas origin inst_tyvars' inst_tys' - inst_decl_theta' + dfun_theta' monobinds uprags True) op_items )) `thenTc` \ (method_binds_s, insts_needed_s, meth_lies_w_ids) -> @@ -572,7 +578,7 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, methods_lie = plusLIEs insts_needed_s in - -- Ditto method bindings + -- Simplify the constraints from methods tcAddErrCtxt methodCtxt ( tcSimplifyAndCheck (ptext SLIT("instance declaration context")) @@ -581,26 +587,10 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, methods_lie ) `thenTc` \ (const_lie1, lie_binds1) -> - -- Check that we *could* construct the superclass dictionaries, - -- even though we are *actually* going to pass the superclass dicts in; - -- the check ensures that the caller will never have - --a problem building them. + -- Figure out bindings for the superclass context tcAddErrCtxt superClassCtxt ( tcSimplifyAndCheck (ptext SLIT("instance declaration context")) - inst_tyvars_set -- Local tyvars - inst_decl_dicts -- The instance dictionaries available - sc_dicts -- The superclass dicationaries reqd - ) `thenTc` \ _ -> - -- Ignore the result; we're only doing - -- this to make sure it can be done. - - -- Now do the simplification again, this time to get the - -- bindings; this time we use an enhanced "avails" - -- Ignore errors because they come from the *previous* tcSimplify - discardErrsTc ( - tcSimplifyAndCheck - (ptext SLIT("instance declaration context")) inst_tyvars_set dfun_arg_dicts -- NB! Don't include this_dict here, else the sc_dicts -- get bound by just selecting from this_dict!! @@ -621,7 +611,7 @@ tcInstDecl2 (InstInfo { iClass = clas, iTyVars = inst_tyvars, iTys = inst_tys, -- emit an error message. This in turn means that we don't -- mention the constructor, which doesn't exist for CCallable, CReturnable -- Hardly beautiful, but only three extra lines. - HsApp (TyApp (HsVar eRROR_ID) [(unUsgTy . idType) this_dict_id]) + HsApp (TyApp (HsVar eRROR_ID) [idType this_dict_id]) (HsLit (HsString msg)) | otherwise -- The common case @@ -672,57 +662,57 @@ We can also have instances for functions: @instance Foo (a -> b) ...@. \begin{code} scrutiniseInstanceConstraint pred - | opt_AllowUndecidableInstances - = returnNF_Tc () + = getDOptsTc `thenTc` \ dflags -> case () of + () + | dopt Opt_AllowUndecidableInstances dflags + -> returnNF_Tc () - | Just (clas,tys) <- getClassTys_maybe pred, - all isTyVarTy tys - = returnNF_Tc () + | Just (clas,tys) <- getClassTys_maybe pred, + all isTyVarTy tys + -> returnNF_Tc () - | otherwise - = addErrTc (instConstraintErr pred) + | otherwise + -> addErrTc (instConstraintErr pred) scrutiniseInstanceHead clas inst_taus - | -- CCALL CHECK + = getDOptsTc `thenTc` \ dflags -> case () of + () + | -- CCALL CHECK -- A user declaration of a CCallable/CReturnable instance -- must be for a "boxed primitive" type. - (clas `hasKey` cCallableClassKey && not (ccallable_type first_inst_tau)) || - (clas `hasKey` cReturnableClassKey && not (creturnable_type first_inst_tau)) - = addErrTc (nonBoxedPrimCCallErr clas first_inst_tau) - - -- DERIVING CHECK - -- It is obviously illegal to have an explicit instance - -- for something that we are also planning to `derive' - | maybeToBool alg_tycon_app_maybe && clas `elem` (tyConDerivings alg_tycon) - = addErrTc (derivingWhenInstanceExistsErr clas first_inst_tau) - -- Kind check will have ensured inst_taus is of length 1 + (clas `hasKey` cCallableClassKey + && not (ccallable_type dflags first_inst_tau)) + || + (clas `hasKey` cReturnableClassKey + && not (creturnable_type first_inst_tau)) + -> addErrTc (nonBoxedPrimCCallErr clas first_inst_tau) -- Allow anything for AllowUndecidableInstances - | opt_AllowUndecidableInstances - = returnNF_Tc () + | dopt Opt_AllowUndecidableInstances dflags + -> returnNF_Tc () -- If GlasgowExts then check at least one isn't a type variable - | opt_GlasgowExts - = if all isTyVarTy inst_taus then - addErrTc (instTypeErr clas inst_taus (text "There must be at least one non-type-variable in the instance head")) - else - returnNF_Tc () + | dopt Opt_GlasgowExts dflags + -> if all isTyVarTy inst_taus + then addErrTc (instTypeErr clas inst_taus + (text "There must be at least one non-type-variable in the instance head")) + else returnNF_Tc () -- WITH HASKELL 1.4, MUST HAVE C (T a b c) - | not (length inst_taus == 1 && - maybeToBool maybe_tycon_app && -- Yes, there's a type constuctor - not (isSynTyCon tycon) && -- ...but not a synonym - all isTyVarTy arg_tys && -- Applied to type variables - length (varSetElems (tyVarsOfTypes arg_tys)) == length arg_tys - -- This last condition checks that all the type variables are distinct - ) - = addErrTc (instTypeErr clas inst_taus - (text "the instance type must be of form (T a b c)" $$ - text "where T is not a synonym, and a,b,c are distinct type variables") - ) - - | otherwise - = returnNF_Tc () + | not (length inst_taus == 1 && + maybeToBool maybe_tycon_app && -- Yes, there's a type constuctor + not (isSynTyCon tycon) && -- ...but not a synonym + all isTyVarTy arg_tys && -- Applied to type variables + length (varSetElems (tyVarsOfTypes arg_tys)) == length arg_tys + -- This last condition checks that all the type variables are distinct + ) + -> addErrTc (instTypeErr clas inst_taus + (text "the instance type must be of form (T a b c)" $$ + text "where T is not a synonym, and a,b,c are distinct type variables") + ) + + | otherwise + -> returnNF_Tc () where (first_inst_tau : _) = inst_taus @@ -731,13 +721,8 @@ scrutiniseInstanceHead clas inst_taus maybe_tycon_app = splitTyConApp_maybe first_inst_tau Just (tycon, arg_tys) = maybe_tycon_app - -- Stuff for an *algebraic* data type - alg_tycon_app_maybe = splitAlgTyConApp_maybe first_inst_tau - -- The "Alg" part looks through synonyms - Just (alg_tycon, _, _) = alg_tycon_app_maybe - -ccallable_type ty = isFFIArgumentTy False {- Not safe call -} ty -creturnable_type ty = isFFIResultTy ty + ccallable_type dflags ty = isFFIArgumentTy dflags False {- Not safe call -} ty + creturnable_type ty = isFFIResultTy ty \end{code} @@ -755,10 +740,10 @@ tcAddDeclCtxt decl thing_inside where (name, loc, thing) = case decl of - (ClassDecl _ name _ _ _ _ _ _ loc) -> (name, loc, "class") - (TySynonym name _ _ loc) -> (name, loc, "type synonym") - (TyData NewType _ name _ _ _ _ _ loc _ _) -> (name, loc, "newtype") - (TyData DataType _ name _ _ _ _ _ loc _ _) -> (name, loc, "data type") + (ClassDecl _ name _ _ _ _ _ loc) -> (name, loc, "class") + (TySynonym name _ _ loc) -> (name, loc, "type synonym") + (TyData NewType _ name _ _ _ _ loc _ _) -> (name, loc, "newtype") + (TyData DataType _ name _ _ _ _ loc _ _) -> (name, loc, "data type") ctxt = hsep [ptext SLIT("In the"), text thing, ptext SLIT("declaration for"), quotes (ppr name)] @@ -780,28 +765,24 @@ missingGenericInstances missing -dupGenericInsts inst_infos +dupGenericInsts tc_inst_infos = vcat [ptext SLIT("More than one type pattern for a single generic type constructor:"), - nest 4 (vcat (map (ppr . simpleInstInfoTy) inst_infos)), + nest 4 (vcat (map ppr_inst_ty tc_inst_infos)), ptext SLIT("All the type patterns for a generic type constructor must be identical") ] + where + ppr_inst_ty (tc,inst) = ppr (simpleInstInfoTy inst) instTypeErr clas tys msg = sep [ptext SLIT("Illegal instance declaration for") <+> quotes (pprConstraint clas tys), nest 4 (parens msg) ] -derivingWhenInstanceExistsErr clas tycon - = hang (hsep [ptext SLIT("Deriving class"), - quotes (ppr clas), - ptext SLIT("type"), quotes (ppr tycon)]) - 4 (ptext SLIT("when an explicit instance exists")) - nonBoxedPrimCCallErr clas inst_ty = hang (ptext SLIT("Unacceptable instance type for ccall-ish class")) 4 (hsep [ ptext SLIT("class"), ppr clas, ptext SLIT("type"), ppr inst_ty]) methodCtxt = ptext SLIT("When checking the methods of an instance declaration") -superClassCtxt = ptext SLIT("When checking the superclasses of an instance declaration") +superClassCtxt = ptext SLIT("When checking the super-classes of an instance declaration") \end{code}