[project @ 2005-04-28 10:09:41 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcTyClsDecls.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996-1998
3 %
4 \section[TcTyClsDecls]{Typecheck type and class declarations}
5
6 \begin{code}
7 module TcTyClsDecls (
8         tcTyAndClassDecls
9     ) where
10
11 #include "HsVersions.h"
12
13 import HsSyn            ( TyClDecl(..),  HsConDetails(..), HsTyVarBndr(..),
14                           ConDecl(..),   Sig(..), , NewOrData(..), 
15                           tyClDeclTyVars, isSynDecl, 
16                           LTyClDecl, tcdName, LHsTyVarBndr
17                         )
18 import HsTypes          ( HsBang(..), getBangStrictness )
19 import BasicTypes       ( RecFlag(..), StrictnessMark(..) )
20 import HscTypes         ( implicitTyThings, ModDetails )
21 import BuildTyCl        ( buildClass, buildAlgTyCon, buildSynTyCon, buildDataCon,
22                           mkDataTyConRhs, mkNewTyConRhs )
23 import TcRnMonad
24 import TcEnv            ( TyThing(..), 
25                           tcLookupLocated, tcLookupLocatedGlobal, 
26                           tcExtendGlobalEnv, tcExtendKindEnv,
27                           tcExtendRecEnv, tcLookupTyVar )
28 import TcTyDecls        ( calcTyConArgVrcs, calcRecFlags, calcClassCycles, calcSynCycles )
29 import TcClassDcl       ( tcClassSigs, tcAddDeclCtxt )
30 import TcHsType         ( kcHsTyVars, kcHsLiftedSigType, kcHsType, 
31                           kcHsContext, tcTyVarBndrs, tcHsKindedType, tcHsKindedContext,
32                           kcHsSigType, tcHsBangType, tcLHsConSig, tcDataKindSig )
33 import TcMType          ( newKindVar, checkValidTheta, checkValidType, checkFreeness, 
34                           UserTypeCtxt(..), SourceTyCtxt(..) ) 
35 import TcUnify          ( unifyKind )
36 import TcType           ( TcKind, TcType, tyVarsOfType, 
37                           mkArrowKind, liftedTypeKind, mkTyVarTys, tcEqTypes,
38                           tcSplitSigmaTy, tcEqType )
39 import Type             ( splitTyConApp_maybe, pprThetaArrow, pprParendType )
40 import Generics         ( validGenericMethodType, canDoGenerics )
41 import Class            ( Class, className, classTyCon, DefMeth(..), classBigSig, classTyVars )
42 import TyCon            ( TyCon, ArgVrcs, AlgTyConRhs( AbstractTyCon ),
43                           tyConDataCons, mkForeignTyCon, isProductTyCon, isRecursiveTyCon,
44                           tyConStupidTheta, getSynTyConDefn, isSynTyCon, tyConName )
45 import DataCon          ( DataCon, dataConWrapId, dataConName, dataConSig, 
46                           dataConFieldLabels, dataConOrigArgTys, dataConTyCon )
47 import Type             ( zipTopTvSubst, substTys )
48 import Var              ( TyVar, idType, idName )
49 import VarSet           ( elemVarSet )
50 import Name             ( Name )
51 import Outputable
52 import Util             ( zipLazy, isSingleton, notNull, sortLe )
53 import List             ( partition )
54 import SrcLoc           ( Located(..), unLoc, getLoc )
55 import ListSetOps       ( equivClasses )
56 import Digraph          ( SCC(..) )
57 import DynFlags         ( DynFlag( Opt_GlasgowExts, Opt_Generics, 
58                                         Opt_UnboxStrictFields ) )
59 \end{code}
60
61
62 %************************************************************************
63 %*                                                                      *
64 \subsection{Type checking for type and class declarations}
65 %*                                                                      *
66 %************************************************************************
67
68 Dealing with a group
69 ~~~~~~~~~~~~~~~~~~~~
70 Consider a mutually-recursive group, binding 
71 a type constructor T and a class C.
72
73 Step 1:         getInitialKind
74         Construct a KindEnv by binding T and C to a kind variable 
75
76 Step 2:         kcTyClDecl
77         In that environment, do a kind check
78
79 Step 3: Zonk the kinds
80
81 Step 4:         buildTyConOrClass
82         Construct an environment binding T to a TyCon and C to a Class.
83         a) Their kinds comes from zonking the relevant kind variable
84         b) Their arity (for synonyms) comes direct from the decl
85         c) The funcional dependencies come from the decl
86         d) The rest comes a knot-tied binding of T and C, returned from Step 4
87         e) The variances of the tycons in the group is calculated from 
88                 the knot-tied stuff
89
90 Step 5:         tcTyClDecl1
91         In this environment, walk over the decls, constructing the TyCons and Classes.
92         This uses in a strict way items (a)-(c) above, which is why they must
93         be constructed in Step 4. Feed the results back to Step 4.
94         For this step, pass the is-recursive flag as the wimp-out flag
95         to tcTyClDecl1.
96         
97
98 Step 6:         Extend environment
99         We extend the type environment with bindings not only for the TyCons and Classes,
100         but also for their "implicit Ids" like data constructors and class selectors
101
102 Step 7:         checkValidTyCl
103         For a recursive group only, check all the decls again, just
104         to check all the side conditions on validity.  We could not
105         do this before because we were in a mutually recursive knot.
106
107
108 The knot-tying parameters: @rec_details_list@ is an alist mapping @Name@s to
109 @TyThing@s.  @rec_vrcs@ is a finite map from @Name@s to @ArgVrcs@s.
110
111 \begin{code}
112 tcTyAndClassDecls :: ModDetails -> [LTyClDecl Name]
113                    -> TcM TcGblEnv      -- Input env extended by types and classes 
114                                         -- and their implicit Ids,DataCons
115 tcTyAndClassDecls boot_details decls
116   = do  {       -- First check for cyclic type synonysm or classes
117                 -- See notes with checkCycleErrs
118           checkCycleErrs decls
119         ; mod <- getModule
120         ; traceTc (text "tcTyAndCl" <+> ppr mod)
121         ; (syn_tycons, alg_tyclss) <- fixM (\ ~(rec_syn_tycons, rec_alg_tyclss) ->
122           do    { let { -- Calculate variances and rec-flag
123                       ; (syn_decls, alg_decls) = partition (isSynDecl . unLoc) decls }
124
125                         -- Extend the global env with the knot-tied results
126                         -- for data types and classes
127                         -- 
128                         -- We must populate the environment with the loop-tied T's right
129                         -- away, because the kind checker may "fault in" some type 
130                         -- constructors that recursively mention T
131                 ; let { gbl_things = mkGlobalThings alg_decls rec_alg_tyclss }
132                 ; tcExtendRecEnv gbl_things $ do
133
134                         -- Kind-check the declarations
135                 { (kc_syn_decls, kc_alg_decls) <- kcTyClDecls syn_decls alg_decls
136
137                 ; let { calc_vrcs = calcTyConArgVrcs (rec_syn_tycons ++ rec_alg_tyclss)
138                       ; calc_rec  = calcRecFlags boot_details rec_alg_tyclss
139                       ; tc_decl   = addLocM (tcTyClDecl calc_vrcs calc_rec) }
140                         -- Type-check the type synonyms, and extend the envt
141                 ; syn_tycons <- tcSynDecls calc_vrcs kc_syn_decls
142                 ; tcExtendGlobalEnv syn_tycons $ do
143
144                         -- Type-check the data types and classes
145                 { alg_tyclss <- mappM tc_decl kc_alg_decls
146                 ; return (syn_tycons, alg_tyclss)
147             }}})
148         -- Finished with knot-tying now
149         -- Extend the environment with the finished things
150         ; tcExtendGlobalEnv (syn_tycons ++ alg_tyclss) $ do
151
152         -- Perform the validity check
153         { traceTc (text "ready for validity check")
154         ; mappM_ (addLocM checkValidTyCl) decls
155         ; traceTc (text "done")
156    
157         -- Add the implicit things;
158         -- we want them in the environment because 
159         -- they may be mentioned in interface files
160         ; let { implicit_things = concatMap implicitTyThings alg_tyclss }
161         ; traceTc ((text "Adding" <+> ppr alg_tyclss) $$ (text "and" <+> ppr implicit_things))
162         ; tcExtendGlobalEnv implicit_things getGblEnv
163     }}
164
165 mkGlobalThings :: [LTyClDecl Name]      -- The decls
166                -> [TyThing]             -- Knot-tied, in 1-1 correspondence with the decls
167                -> [(Name,TyThing)]
168 -- Driven by the Decls, and treating the TyThings lazily
169 -- make a TypeEnv for the new things
170 mkGlobalThings decls things
171   = map mk_thing (decls `zipLazy` things)
172   where
173     mk_thing (L _ (ClassDecl {tcdLName = L _ name}), ~(AClass cl))
174          = (name, AClass cl)
175     mk_thing (L _ decl, ~(ATyCon tc))
176          = (tcdName decl, ATyCon tc)
177 \end{code}
178
179
180 %************************************************************************
181 %*                                                                      *
182                 Kind checking
183 %*                                                                      *
184 %************************************************************************
185
186 We need to kind check all types in the mutually recursive group
187 before we know the kind of the type variables.  For example:
188
189 class C a where
190    op :: D b => a -> b -> b
191
192 class D c where
193    bop :: (Monad c) => ...
194
195 Here, the kind of the locally-polymorphic type variable "b"
196 depends on *all the uses of class D*.  For example, the use of
197 Monad c in bop's type signature means that D must have kind Type->Type.
198
199 However type synonyms work differently.  They can have kinds which don't
200 just involve (->) and *:
201         type R = Int#           -- Kind #
202         type S a = Array# a     -- Kind * -> #
203         type T a b = (# a,b #)  -- Kind * -> * -> (# a,b #)
204 So we must infer their kinds from their right-hand sides *first* and then
205 use them, whereas for the mutually recursive data types D we bring into
206 scope kind bindings D -> k, where k is a kind variable, and do inference.
207
208 \begin{code}
209 kcTyClDecls syn_decls alg_decls
210   = do  {       -- First extend the kind env with each data 
211                 -- type and class, mapping them to a type variable
212           alg_kinds <- mappM getInitialKind alg_decls
213         ; tcExtendKindEnv alg_kinds $ do
214
215                 -- Now kind-check the type synonyms, in dependency order
216                 -- We do these differently to data type and classes,
217                 -- because a type synonym can be an unboxed type
218                 --      type Foo = Int#
219                 -- and a kind variable can't unify with UnboxedTypeKind
220                 -- So we infer their kinds in dependency order
221         { (kc_syn_decls, syn_kinds) <- kcSynDecls (calcSynCycles syn_decls)
222         ; tcExtendKindEnv syn_kinds $  do
223
224                 -- Now kind-check the data type and class declarations, 
225                 -- returning kind-annotated decls
226         { kc_alg_decls <- mappM (wrapLocM kcTyClDecl) alg_decls
227
228         ; return (kc_syn_decls, kc_alg_decls) }}}
229
230 ------------------------------------------------------------------------
231 getInitialKind :: LTyClDecl Name -> TcM (Name, TcKind)
232
233 getInitialKind decl
234  = newKindVar                   `thenM` \ kind  ->
235    returnM (unLoc (tcdLName (unLoc decl)), kind)
236
237 ----------------
238 kcSynDecls :: [SCC (LTyClDecl Name)] 
239            -> TcM ([LTyClDecl Name],    -- Kind-annotated decls
240                    [(Name,TcKind)])     -- Kind bindings
241 kcSynDecls []
242   = return ([], [])
243 kcSynDecls (group : groups)
244   = do  { (decl,  nk)  <- kcSynDecl group
245         ; (decls, nks) <- tcExtendKindEnv [nk] (kcSynDecls groups)
246         ; return (decl:decls, nk:nks) }
247                         
248 ----------------
249 kcSynDecl :: SCC (LTyClDecl Name) 
250            -> TcM (LTyClDecl Name,      -- Kind-annotated decls
251                    (Name,TcKind))       -- Kind bindings
252 kcSynDecl (AcyclicSCC ldecl@(L loc decl))
253   = tcAddDeclCtxt decl  $
254     kcHsTyVars (tcdTyVars decl) (\ k_tvs ->
255     do { traceTc (text "kcd1" <+> ppr (unLoc (tcdLName decl)) <+> brackets (ppr (tcdTyVars decl)) 
256                         <+> brackets (ppr k_tvs))
257        ; (k_rhs, rhs_kind) <- kcHsType (tcdSynRhs decl)
258        ; traceTc (text "kcd2" <+> ppr (unLoc (tcdLName decl)))
259        ; let tc_kind = foldr (mkArrowKind . kindedTyVarKind) rhs_kind k_tvs
260        ; return (L loc (decl { tcdTyVars = k_tvs, tcdSynRhs = k_rhs }),
261                  (unLoc (tcdLName decl), tc_kind)) })
262
263 kcSynDecl (CyclicSCC decls)
264   = do { recSynErr decls; failM }       -- Fail here to avoid error cascade
265                                         -- of out-of-scope tycons
266
267 ------------------------------------------------------------------------
268 kcTyClDecl :: TyClDecl Name -> TcM (TyClDecl Name)
269         -- Not used for type synonyms (see kcSynDecl)
270
271 kcTyClDecl decl@(TyData {tcdND = new_or_data, tcdCtxt = ctxt, tcdCons = cons})
272   = kcTyClDeclBody decl $ \ tvs' ->
273     do  { ctxt' <- kcHsContext ctxt     
274         ; cons' <- mappM (wrapLocM kc_con_decl) cons
275         ; return (decl {tcdTyVars = tvs', tcdCtxt = ctxt', tcdCons = cons'}) }
276   where
277     kc_con_decl (ConDecl name ex_tvs ex_ctxt details)
278       = kcHsTyVars ex_tvs               $ \ ex_tvs' ->
279         do { ex_ctxt' <- kcHsContext ex_ctxt
280            ; details' <- kc_con_details details 
281            ; return (ConDecl name ex_tvs' ex_ctxt' details')}
282     kc_con_decl (GadtDecl name ty)
283         = do { ty' <- kcHsSigType ty
284              ; traceTc (text "kc_con_decl" <+> ppr name <+> ppr ty')
285              ; return (GadtDecl name ty') }
286
287     kc_con_details (PrefixCon btys) 
288         = do { btys' <- mappM kc_larg_ty btys ; return (PrefixCon btys') }
289     kc_con_details (InfixCon bty1 bty2) 
290         = do { bty1' <- kc_larg_ty bty1; bty2' <- kc_larg_ty bty2; return (InfixCon bty1' bty2') }
291     kc_con_details (RecCon fields) 
292         = do { fields' <- mappM kc_field fields; return (RecCon fields') }
293
294     kc_field (fld, bty) = do { bty' <- kc_larg_ty bty ; return (fld, bty') }
295
296     kc_larg_ty bty = case new_or_data of
297                         DataType -> kcHsSigType bty
298                         NewType  -> kcHsLiftedSigType bty
299         -- Can't allow an unlifted type for newtypes, because we're effectively
300         -- going to remove the constructor while coercing it to a lifted type.
301         -- And newtypes can't be bang'd
302
303 kcTyClDecl decl@(ClassDecl {tcdCtxt = ctxt,  tcdSigs = sigs})
304   = kcTyClDeclBody decl $ \ tvs' ->
305     do  { ctxt' <- kcHsContext ctxt     
306         ; sigs' <- mappM (wrapLocM kc_sig) sigs
307         ; return (decl {tcdTyVars = tvs', tcdCtxt = ctxt', tcdSigs = sigs'}) }
308   where
309     kc_sig (Sig nm op_ty) = do { op_ty' <- kcHsLiftedSigType op_ty
310                                 ; return (Sig nm op_ty') }
311     kc_sig other_sig          = return other_sig
312
313 kcTyClDecl decl@(ForeignType {})
314   = return decl
315
316 kcTyClDeclBody :: TyClDecl Name
317                -> ([LHsTyVarBndr Name] -> TcM a)
318                -> TcM a
319   -- Extend the env with bindings for the tyvars, taken from
320   -- the kind of the tycon/class.  Give it to the thing inside, and 
321   -- check the result kind matches
322 kcTyClDeclBody decl thing_inside
323   = tcAddDeclCtxt decl          $
324     kcHsTyVars (tyClDeclTyVars decl)    $ \ kinded_tvs ->
325     do  { tc_ty_thing <- tcLookupLocated (tcdLName decl)
326         ; let tc_kind = case tc_ty_thing of { AThing k -> k }
327         ; 
328         ; traceTc (text "kcbody" <+> ppr decl <+> ppr tc_kind <+> ppr (map kindedTyVarKind kinded_tvs)  <+> ppr (result_kind decl))
329         ; unifyKind tc_kind (foldr (mkArrowKind . kindedTyVarKind) 
330                                    (result_kind decl)
331                                    kinded_tvs)
332         ; thing_inside kinded_tvs }
333   where
334     result_kind (TyData { tcdKindSig = Just kind }) = kind
335     result_kind other                               = liftedTypeKind
336         -- On GADT-style declarations we allow a kind signature
337         --      data T :: *->* where { ... }
338
339 kindedTyVarKind (L _ (KindedTyVar _ k)) = k
340 \end{code}
341
342
343 %************************************************************************
344 %*                                                                      *
345 \subsection{Type checking}
346 %*                                                                      *
347 %************************************************************************
348
349 \begin{code}
350 tcSynDecls :: (Name -> ArgVrcs) -> [LTyClDecl Name] -> TcM [TyThing]
351 tcSynDecls calc_vrcs [] = return []
352 tcSynDecls calc_vrcs (decl : decls) 
353   = do { syn_tc <- addLocM (tcSynDecl calc_vrcs) decl
354        ; syn_tcs <- tcExtendGlobalEnv [syn_tc] (tcSynDecls calc_vrcs decls)
355        ; return (syn_tc : syn_tcs) }
356
357 tcSynDecl calc_vrcs 
358   (TySynonym {tcdLName = L _ tc_name, tcdTyVars = tvs, tcdSynRhs = rhs_ty})
359   = tcTyVarBndrs tvs            $ \ tvs' -> do 
360     { traceTc (text "tcd1" <+> ppr tc_name) 
361     ; rhs_ty' <- tcHsKindedType rhs_ty
362     ; return (ATyCon (buildSynTyCon tc_name tvs' rhs_ty' (calc_vrcs tc_name))) }
363
364 --------------------
365 tcTyClDecl :: (Name -> ArgVrcs) -> (Name -> RecFlag) 
366            -> TyClDecl Name -> TcM TyThing
367
368 tcTyClDecl calc_vrcs calc_isrec decl
369   = tcAddDeclCtxt decl (tcTyClDecl1 calc_vrcs calc_isrec decl)
370
371 tcTyClDecl1 calc_vrcs calc_isrec 
372   (TyData {tcdND = new_or_data, tcdCtxt = ctxt, tcdTyVars = tvs,
373            tcdLName = L _ tc_name, tcdKindSig = mb_ksig, tcdCons = cons})
374   = tcTyVarBndrs tvs    $ \ tvs' -> do 
375   { extra_tvs <- tcDataKindSig mb_ksig
376   ; let final_tvs = tvs' ++ extra_tvs
377   ; stupid_theta <- tcHsKindedContext ctxt
378   ; want_generic <- doptM Opt_Generics
379   ; unbox_strict <- doptM Opt_UnboxStrictFields
380   ; gla_exts     <- doptM Opt_GlasgowExts
381   ; is_boot      <- tcIsHsBoot  -- Are we compiling an hs-boot file?
382
383         -- Check that we don't use GADT syntax in H98 world
384   ; checkTc (gla_exts || h98_syntax) (badGadtDecl tc_name)
385
386         -- Check that there's at least one condecl,
387         -- or else we're reading an interface file, or -fglasgow-exts
388   ; checkTc (not (null cons) || gla_exts || is_boot)
389             (emptyConDeclsErr tc_name)
390     
391   ; tycon <- fixM (\ tycon -> do 
392         { data_cons <- mappM (addLocM (tcConDecl unbox_strict new_or_data 
393                                                  tycon final_tvs)) 
394                              cons
395         ; let tc_rhs 
396                 | null cons && is_boot  -- In a hs-boot file, empty cons means
397                 = AbstractTyCon         -- "don't know"; hence Abstract
398                 | otherwise
399                 = case new_or_data of
400                         DataType -> mkDataTyConRhs data_cons
401                         NewType  -> ASSERT( isSingleton data_cons )
402                                     mkNewTyConRhs tycon (head data_cons)
403         ; buildAlgTyCon tc_name final_tvs stupid_theta tc_rhs arg_vrcs is_rec
404                         (want_generic && canDoGenerics data_cons)
405         })
406   ; return (ATyCon tycon)
407   }
408   where
409     arg_vrcs = calc_vrcs tc_name
410     is_rec   = calc_isrec tc_name
411     h98_syntax = case cons of   -- All constructors have same shape
412                         L _ (GadtDecl {}) : _ -> False
413                         other -> True
414
415 tcTyClDecl1 calc_vrcs calc_isrec 
416   (ClassDecl {tcdLName = L _ class_name, tcdTyVars = tvs, 
417               tcdCtxt = ctxt, tcdMeths = meths,
418               tcdFDs = fundeps, tcdSigs = sigs} )
419   = tcTyVarBndrs tvs            $ \ tvs' -> do 
420   { ctxt' <- tcHsKindedContext ctxt
421   ; fds' <- mappM (addLocM tc_fundep) fundeps
422   ; sig_stuff <- tcClassSigs class_name sigs meths
423   ; clas <- fixM (\ clas ->
424                 let     -- This little knot is just so we can get
425                         -- hold of the name of the class TyCon, which we
426                         -- need to look up its recursiveness and variance
427                     tycon_name = tyConName (classTyCon clas)
428                     tc_isrec = calc_isrec tycon_name
429                     tc_vrcs  = calc_vrcs  tycon_name
430                 in
431                 buildClass class_name tvs' ctxt' fds' 
432                            sig_stuff tc_isrec tc_vrcs)
433   ; return (AClass clas) }
434   where
435     tc_fundep (tvs1, tvs2) = do { tvs1' <- mappM tcLookupTyVar tvs1 ;
436                                 ; tvs2' <- mappM tcLookupTyVar tvs2 ;
437                                 ; return (tvs1', tvs2') }
438
439
440 tcTyClDecl1 calc_vrcs calc_isrec 
441   (ForeignType {tcdLName = L _ tc_name, tcdExtName = tc_ext_name})
442   = returnM (ATyCon (mkForeignTyCon tc_name tc_ext_name liftedTypeKind 0 []))
443
444 -----------------------------------
445 tcConDecl :: Bool               -- True <=> -funbox-strict_fields
446           -> NewOrData -> TyCon -> [TyVar]
447           -> ConDecl Name -> TcM DataCon
448
449 tcConDecl unbox_strict NewType tycon tc_tvs     -- Newtypes
450           (ConDecl name ex_tvs ex_ctxt details)
451   = ASSERT( null ex_tvs && null (unLoc ex_ctxt) )       
452     do  { let tc_datacon field_lbls arg_ty
453                 = do { arg_ty' <- tcHsKindedType arg_ty -- No bang on newtype
454                      ; buildDataCon (unLoc name) False {- Prefix -} 
455                                     True {- Vanilla -} [NotMarkedStrict]
456                                     (map unLoc field_lbls)
457                                     tc_tvs [] [arg_ty']
458                                     tycon (mkTyVarTys tc_tvs) }
459         ; case details of
460             PrefixCon [arg_ty] -> tc_datacon [] arg_ty
461             RecCon [(field_lbl, arg_ty)] -> tc_datacon [field_lbl] arg_ty }
462
463 tcConDecl unbox_strict DataType tycon tc_tvs    -- Ordinary data types
464           (ConDecl name ex_tvs ex_ctxt details)
465   = tcTyVarBndrs ex_tvs         $ \ ex_tvs' -> do 
466     { ex_ctxt' <- tcHsKindedContext ex_ctxt
467     ; let 
468         is_vanilla = null ex_tvs && null (unLoc ex_ctxt) 
469                 -- Vanilla iff no ex_tvs and no context
470                 -- Must check the context too because of
471                 -- implicit params; e.g.
472                 --  data T = (?x::Int) => MkT Int
473
474         tc_datacon is_infix field_lbls btys
475           = do { let { bangs = map getBangStrictness btys }
476                ; arg_tys <- mappM tcHsBangType btys
477                ; buildDataCon (unLoc name) is_infix is_vanilla
478                     (argStrictness unbox_strict tycon bangs arg_tys)
479                     (map unLoc field_lbls)
480                     (tc_tvs ++ ex_tvs')
481                     ex_ctxt'
482                     arg_tys
483                     tycon (mkTyVarTys tc_tvs) }
484     ; case details of
485         PrefixCon btys     -> tc_datacon False [] btys
486         InfixCon bty1 bty2 -> tc_datacon True [] [bty1,bty2]
487         RecCon fields      -> do { checkTc (null ex_tvs) (exRecConErr name)
488                 -- It's ok to have an implicit-parameter context
489                 -- for the data constructor, provided it binds
490                 -- no type variables
491                                  ; let { (field_names, btys) = unzip fields }
492                                  ; tc_datacon False field_names btys } }
493
494 tcConDecl unbox_strict DataType tycon tc_tvs    -- GADTs
495           decl@(GadtDecl name con_ty)
496   = do  { traceTc (text "tcConDecl"  <+> ppr name)
497         ; (tvs, theta, bangs, arg_tys, data_tc, res_tys) <- tcLHsConSig con_ty
498                 
499         ; traceTc (text "tcConDecl1"  <+> ppr name)
500         ; let   -- Now dis-assemble the type, and check its form
501               is_vanilla = null theta && mkTyVarTys tvs `tcEqTypes` res_tys
502
503                 -- Vanilla datacons guarantee to use the same
504                 -- type variables as the parent tycon
505               (tvs', arg_tys', res_tys') 
506                   | is_vanilla = (tc_tvs, substTys subst arg_tys, substTys subst res_tys)
507                   | otherwise  = (tvs, arg_tys, res_tys)
508               subst = zipTopTvSubst tvs (mkTyVarTys tc_tvs)
509
510         ; traceTc (text "tcConDecl3"  <+> ppr name)
511         ; buildDataCon (unLoc name) False {- Not infix -} is_vanilla
512                        (argStrictness unbox_strict tycon bangs arg_tys)
513                        [{- No field labels -}]
514                        tvs' theta arg_tys' data_tc res_tys' }
515                 -- NB:  we put data_tc, the type constructor gotten from the constructor 
516                 --      type signature into the data constructor; that way checkValidDataCon 
517                 --      can complain if it's wrong.
518
519 -------------------
520 argStrictness :: Bool           -- True <=> -funbox-strict_fields
521               -> TyCon -> [HsBang]
522               -> [TcType] -> [StrictnessMark]
523 argStrictness unbox_strict tycon bangs arg_tys
524  = ASSERT( length bangs == length arg_tys )
525    zipWith (chooseBoxingStrategy unbox_strict tycon) arg_tys bangs
526
527 -- We attempt to unbox/unpack a strict field when either:
528 --   (i)  The field is marked '!!', or
529 --   (ii) The field is marked '!', and the -funbox-strict-fields flag is on.
530
531 chooseBoxingStrategy :: Bool -> TyCon -> TcType -> HsBang -> StrictnessMark
532 chooseBoxingStrategy unbox_strict_fields tycon arg_ty bang
533   = case bang of
534         HsNoBang                                    -> NotMarkedStrict
535         HsStrict | unbox_strict_fields && can_unbox -> MarkedUnboxed
536         HsUnbox  | can_unbox                        -> MarkedUnboxed
537         other                                       -> MarkedStrict
538   where
539     can_unbox = case splitTyConApp_maybe arg_ty of
540                    Nothing             -> False
541                    Just (arg_tycon, _) -> not (isRecursiveTyCon tycon) &&
542                                           isProductTyCon arg_tycon
543 \end{code}
544
545 %************************************************************************
546 %*                                                                      *
547 \subsection{Dependency analysis}
548 %*                                                                      *
549 %************************************************************************
550
551 Validity checking is done once the mutually-recursive knot has been
552 tied, so we can look at things freely.
553
554 \begin{code}
555 checkCycleErrs :: [LTyClDecl Name] -> TcM ()
556 checkCycleErrs tyclss
557   | null cls_cycles
558   = return ()
559   | otherwise
560   = do  { mappM_ recClsErr cls_cycles
561         ; failM }       -- Give up now, because later checkValidTyCl
562                         -- will loop if the synonym is recursive
563   where
564     cls_cycles = calcClassCycles tyclss
565
566 checkValidTyCl :: TyClDecl Name -> TcM ()
567 -- We do the validity check over declarations, rather than TyThings
568 -- only so that we can add a nice context with tcAddDeclCtxt
569 checkValidTyCl decl
570   = tcAddDeclCtxt decl $
571     do  { thing <- tcLookupLocatedGlobal (tcdLName decl)
572         ; traceTc (text "Validity of" <+> ppr thing)    
573         ; case thing of
574             ATyCon tc -> checkValidTyCon tc
575             AClass cl -> checkValidClass cl 
576         ; traceTc (text "Done validity of" <+> ppr thing)       
577         }
578
579 -------------------------
580 checkValidTyCon :: TyCon -> TcM ()
581 checkValidTyCon tc
582   | isSynTyCon tc 
583   = checkValidType syn_ctxt syn_rhs
584   | otherwise
585   =     -- Check the context on the data decl
586     checkValidTheta (DataTyCtxt name) (tyConStupidTheta tc)     `thenM_` 
587         
588         -- Check arg types of data constructors
589     mappM_ (checkValidDataCon tc) data_cons                     `thenM_`
590
591         -- Check that fields with the same name share a type
592     mappM_ check_fields groups
593
594   where
595     syn_ctxt     = TySynCtxt name
596     name         = tyConName tc
597     (_, syn_rhs) = getSynTyConDefn tc
598     data_cons    = tyConDataCons tc
599
600     groups = equivClasses cmp_fld (concatMap get_fields data_cons)
601     cmp_fld (f1,_) (f2,_) = f1 `compare` f2
602     get_fields con = dataConFieldLabels con `zip` dataConOrigArgTys con
603         -- dataConFieldLabels may return the empty list, which is fine
604
605     check_fields fields@((first_field_label, field_ty) : other_fields)
606         -- These fields all have the same name, but are from
607         -- different constructors in the data type
608         =       -- Check that all the fields in the group have the same type
609                 -- NB: this check assumes that all the constructors of a given
610                 -- data type use the same type variables
611           checkTc (all (tcEqType field_ty . snd) other_fields) 
612                   (fieldTypeMisMatch first_field_label)
613
614 -------------------------------
615 checkValidDataCon :: TyCon -> DataCon -> TcM ()
616 checkValidDataCon tc con
617   = addErrCtxt (dataConCtxt con) $ 
618     do  { checkTc (dataConTyCon con == tc) (badDataConTyCon con)
619         ; checkValidType ctxt (idType (dataConWrapId con)) }
620
621                 -- This checks the argument types and
622                 -- ambiguity of the existential context (if any)
623                 -- 
624                 -- Note [Sept 04] Now that tvs is all the tvs, this
625                 -- test doesn't actually check anything
626 --      ; checkFreeness tvs ex_theta }
627   where
628     ctxt = ConArgCtxt (dataConName con) 
629 --    (tvs, ex_theta, _, _, _) = dataConSig con
630
631
632 -------------------------------
633 checkValidClass :: Class -> TcM ()
634 checkValidClass cls
635   = do  {       -- CHECK ARITY 1 FOR HASKELL 1.4
636           gla_exts <- doptM Opt_GlasgowExts
637
638         -- Check that the class is unary, unless GlaExs
639         ; checkTc (notNull tyvars) (nullaryClassErr cls)
640         ; checkTc (gla_exts || unary) (classArityErr cls)
641
642         -- Check the super-classes
643         ; checkValidTheta (ClassSCCtxt (className cls)) theta
644
645         -- Check the class operations
646         ; mappM_ check_op op_stuff
647
648         -- Check that if the class has generic methods, then the
649         -- class has only one parameter.  We can't do generic
650         -- multi-parameter type classes!
651         ; checkTc (unary || no_generics) (genericMultiParamErr cls)
652         }
653   where
654     (tyvars, theta, _, op_stuff) = classBigSig cls
655     unary       = isSingleton tyvars
656     no_generics = null [() | (_, GenDefMeth) <- op_stuff]
657
658     check_op (sel_id, dm) 
659       = addErrCtxt (classOpCtxt sel_id tau) $ do
660         { checkValidTheta SigmaCtxt (tail theta)
661                 -- The 'tail' removes the initial (C a) from the
662                 -- class itself, leaving just the method type
663
664         ; checkValidType (FunSigCtxt op_name) tau
665
666                 -- Check that the type mentions at least one of
667                 -- the class type variables
668         ; checkTc (any (`elemVarSet` tyVarsOfType tau) tyvars)
669                   (noClassTyVarErr cls sel_id)
670
671                 -- Check that for a generic method, the type of 
672                 -- the method is sufficiently simple
673         ; checkTc (dm /= GenDefMeth || validGenericMethodType tau)
674                   (badGenericMethodType op_name op_ty)
675         }
676         where
677           op_name = idName sel_id
678           op_ty   = idType sel_id
679           (_,theta,tau) = tcSplitSigmaTy op_ty
680
681
682
683 ---------------------------------------------------------------------
684 fieldTypeMisMatch field_name
685   = sep [ptext SLIT("Different constructors give different types for field"), quotes (ppr field_name)]
686
687 dataConCtxt con = sep [ptext SLIT("When checking the data constructor:"),
688                        nest 2 (ex_part <+> pprThetaArrow ex_theta <+> ppr con <+> arg_part)]
689   where
690     (ex_tvs, ex_theta, arg_tys, _, _) = dataConSig con
691     ex_part | null ex_tvs = empty
692             | otherwise   = ptext SLIT("forall") <+> hsep (map ppr ex_tvs) <> dot
693         -- The 'ex_theta' part could be non-empty, if the user (bogusly) wrote
694         --      data T a = Eq a => T a a
695         -- So we make sure to print it
696
697     fields = dataConFieldLabels con
698     arg_part | null fields = sep (map pprParendType arg_tys)
699              | otherwise   = braces (sep (punctuate comma 
700                              [ ppr n <+> dcolon <+> ppr ty 
701                              | (n,ty) <- fields `zip` arg_tys]))
702
703 classOpCtxt sel_id tau = sep [ptext SLIT("When checking the class method:"),
704                               nest 2 (ppr sel_id <+> dcolon <+> ppr tau)]
705
706 nullaryClassErr cls
707   = ptext SLIT("No parameters for class")  <+> quotes (ppr cls)
708
709 classArityErr cls
710   = vcat [ptext SLIT("Too many parameters for class") <+> quotes (ppr cls),
711           parens (ptext SLIT("Use -fglasgow-exts to allow multi-parameter classes"))]
712
713 noClassTyVarErr clas op
714   = sep [ptext SLIT("The class method") <+> quotes (ppr op),
715          ptext SLIT("mentions none of the type variables of the class") <+> 
716                 ppr clas <+> hsep (map ppr (classTyVars clas))]
717
718 genericMultiParamErr clas
719   = ptext SLIT("The multi-parameter class") <+> quotes (ppr clas) <+> 
720     ptext SLIT("cannot have generic methods")
721
722 badGenericMethodType op op_ty
723   = hang (ptext SLIT("Generic method type is too complex"))
724        4 (vcat [ppr op <+> dcolon <+> ppr op_ty,
725                 ptext SLIT("You can only use type variables, arrows, lists, and tuples")])
726
727 recSynErr syn_decls
728   = setSrcSpan (getLoc (head sorted_decls)) $
729     addErr (sep [ptext SLIT("Cycle in type synonym declarations:"),
730                  nest 2 (vcat (map ppr_decl sorted_decls))])
731   where
732     sorted_decls = sortLocated syn_decls
733     ppr_decl (L loc decl) = ppr loc <> colon <+> ppr decl
734
735 recClsErr cls_decls
736   = setSrcSpan (getLoc (head sorted_decls)) $
737     addErr (sep [ptext SLIT("Cycle in class declarations (via superclasses):"),
738                  nest 2 (vcat (map ppr_decl sorted_decls))])
739   where
740     sorted_decls = sortLocated cls_decls
741     ppr_decl (L loc decl) = ppr loc <> colon <+> ppr (decl { tcdSigs = [] })
742
743 sortLocated :: [Located a] -> [Located a]
744 sortLocated things = sortLe le things
745   where
746     le (L l1 _) (L l2 _) = l1 <= l2
747
748 exRecConErr name
749   = ptext SLIT("Can't combine named fields with locally-quantified type variables or context")
750     $$
751     (ptext SLIT("In the declaration of data constructor") <+> ppr name)
752
753 badDataConTyCon data_con
754   = hang (ptext SLIT("Data constructor") <+> quotes (ppr data_con) <+>
755                 ptext SLIT("returns type") <+> quotes (ppr (dataConTyCon data_con)))
756        2 (ptext SLIT("instead of its parent type"))
757
758 badGadtDecl tc_name
759   = vcat [ ptext SLIT("Illegal generalised algebraic data declaration for") <+> quotes (ppr tc_name)
760          , nest 2 (parens $ ptext SLIT("Use -fglasgow-exts to allow GADTs")) ]
761
762 emptyConDeclsErr tycon
763   = sep [quotes (ppr tycon) <+> ptext SLIT("has no constructors"),
764          nest 4 (ptext SLIT("(-fglasgow-exts permits this)"))]
765 \end{code}