Fix Trac #3966: warn about useless UNPACK pragmas
[ghc-hetmet.git] / compiler / iface / BuildTyCl.lhs
index 534bc5f..738a5e3 100644 (file)
@@ -4,32 +4,22 @@
 %
 
 \begin{code}
-{-# OPTIONS -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
--- for details
-
 module BuildTyCl (
        buildSynTyCon, buildAlgTyCon, buildDataCon,
        buildClass,
        mkAbstractTyConRhs, mkOpenDataTyConRhs, 
-       mkNewTyConRhs, mkDataTyConRhs 
+       mkNewTyConRhs, mkDataTyConRhs, setAssocFamilyPermutation
     ) where
 
 #include "HsVersions.h"
 
 import IfaceEnv
-import TcRnMonad
 
 import DataCon
 import Var
 import VarSet
-import TysWiredIn
 import BasicTypes
 import Name
-import OccName
 import MkId
 import Class
 import TyCon
@@ -37,9 +27,8 @@ import Type
 import Coercion
 
 import TcRnMonad
+import Util            ( count )
 import Outputable
-
-import Data.List
 \end{code}
        
 
@@ -47,22 +36,23 @@ import Data.List
 ------------------------------------------------------
 buildSynTyCon :: Name -> [TyVar] 
               -> SynTyConRhs 
+             -> Kind                   -- Kind of the RHS
              -> Maybe (TyCon, [Type])  -- family instance if applicable
               -> TcRnIf m n TyCon
 
-buildSynTyCon tc_name tvs rhs@(OpenSynTyCon rhs_ki _) _
+buildSynTyCon tc_name tvs rhs@(OpenSynTyCon {}) rhs_kind _
   = let
-      kind = mkArrowKinds (map tyVarKind tvs) rhs_ki
+      kind = mkArrowKinds (map tyVarKind tvs) rhs_kind
     in
     return $ mkSynTyCon tc_name kind tvs rhs NoParentTyCon
     
-buildSynTyCon tc_name tvs rhs@(SynonymTyCon rhs_ty) mb_family
+buildSynTyCon tc_name tvs rhs@(SynonymTyCon {}) rhs_kind mb_family
   = do { -- We need to tie a knot as the coercion of a data instance depends
         -- on the instance representation tycon and vice versa.
        ; tycon <- fixM (\ tycon_rec -> do 
         { parent <- mkParentInfo mb_family tc_name tvs tycon_rec
         ; let { tycon   = mkSynTyCon tc_name kind tvs rhs parent
-              ; kind    = mkArrowKinds (map tyVarKind tvs) (typeKind rhs_ty)
+              ; kind    = mkArrowKinds (map tyVarKind tvs) rhs_kind
               }
          ; return tycon
          })
@@ -86,9 +76,8 @@ buildAlgTyCon tc_name tvs stupid_theta rhs is_rec want_generics gadt_syn
        ; tycon <- fixM (\ tycon_rec -> do 
         { parent <- mkParentInfo mb_family tc_name tvs tycon_rec
         ; let { tycon = mkAlgTyCon tc_name kind tvs stupid_theta rhs
-                                   fields parent is_rec want_generics gadt_syn
-              ; kind    = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
-              ; fields  = mkTyConSelIds tycon rhs
+                                   parent is_rec want_generics gadt_syn
+              ; kind  = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
               }
          ; return tycon
          })
@@ -100,7 +89,7 @@ buildAlgTyCon tc_name tvs stupid_theta rhs is_rec want_generics gadt_syn
 --
 -- (1) create a coercion that identifies the family instance type and the
 --     representation type from Step (1); ie, it is of the form 
---        `Co tvs :: F ts :=: R tvs', where `Co' is the name of the coercion,
+--        `Co tvs :: F ts ~ R tvs', where `Co' is the name of the coercion,
 --        `F' the family tycon and `R' the (derived) representation tycon,
 --        and
 -- (2) produce a `TyConParent' value containing the parent and coercion
@@ -129,7 +118,18 @@ mkOpenDataTyConRhs = OpenTyCon Nothing
 
 mkDataTyConRhs :: [DataCon] -> AlgTyConRhs
 mkDataTyConRhs cons
-  = DataTyCon { data_cons = cons, is_enum = all isNullarySrcDataCon cons }
+  = DataTyCon {
+        data_cons = cons,
+        is_enum = -- We define datatypes with no constructors to not be
+                  -- enumerations; this fixes trac #2578,  Otherwise we
+                  -- end up generating an empty table for
+                  --   <mod>_<type>_closure_tbl
+                  -- which is used by tagToEnum# to map Int# to constructors
+                  -- in an enumeration. The empty table apparently upset
+                  -- the linker.
+                  not (null cons) &&
+                  all isNullarySrcDataCon cons
+    }
 
 mkNewTyConRhs :: Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs
 -- Monadic because it makes a Name for the coercion TyCon
@@ -155,13 +155,16 @@ mkNewTyConRhs tycon_name tycon con
         -- non-recursive newtypes
     all_coercions = True
     tvs    = tyConTyVars tycon
-    rhs_ty = ASSERT(not (null (dataConInstOrigDictsAndArgTys con (mkTyVarTys tvs)))) 
-            -- head (dataConInstOrigArgTys con (mkTyVarTys tvs))
-            head (dataConInstOrigDictsAndArgTys con (mkTyVarTys tvs))
+    inst_con_ty = applyTys (dataConUserType con) (mkTyVarTys tvs)
+    rhs_ty = ASSERT( isFunTy inst_con_ty ) funArgTy inst_con_ty
        -- Instantiate the data con with the 
        -- type variables from the tycon
-       -- NB: a newtype DataCon has no existentials; hence the
-       --     call to dataConInstOrigArgTys has the right type args
+       -- NB: a newtype DataCon has a type that must look like
+       --        forall tvs.  <arg-ty> -> T tvs
+       -- Note that we *can't* use dataConInstOrigArgTys here because
+       -- the newtype arising from   class Foo a => Bar a where {}
+       -- has a single argument (Foo a) that is a *type class*, so
+       -- dataConInstOrigArgTys returns [].
 
     etad_tvs :: [TyVar]        -- Matched lazily, so that mkNewTypeCoercion can
     etad_rhs :: Type   -- return a TyCon without pulling on rhs_ty
@@ -179,22 +182,30 @@ mkNewTyConRhs tycon_name tycon con
     eta_reduce tvs ty = (reverse tvs, ty)
                                
 
+setAssocFamilyPermutation :: [TyVar] -> TyThing -> TyThing
+setAssocFamilyPermutation clas_tvs (ATyCon tc) 
+  = ATyCon (setTyConArgPoss clas_tvs tc)
+setAssocFamilyPermutation _clas_tvs other
+  = pprPanic "setAssocFamilyPermutation" (ppr other)
+
+
 ------------------------------------------------------
 buildDataCon :: Name -> Bool
-           -> [StrictnessMark] 
+           -> [HsBang] 
            -> [Name]                   -- Field labels
            -> [TyVar] -> [TyVar]       -- Univ and ext 
             -> [(TyVar,Type)]           -- Equality spec
            -> ThetaType                -- Does not include the "stupid theta"
                                        -- or the GADT equalities
-           -> [Type] -> TyCon
+           -> [Type] -> Type           -- Argument and result types
+           -> TyCon                    -- Rep tycon
            -> TcRnIf m n DataCon
 -- A wrapper for DataCon.mkDataCon that
 --   a) makes the worker Id
 --   b) makes the wrapper Id if necessary, including
 --     allocating its unique (hence monadic)
 buildDataCon src_name declared_infix arg_stricts field_lbls
-            univ_tvs ex_tvs eq_spec ctxt arg_tys tycon
+            univ_tvs ex_tvs eq_spec ctxt arg_tys res_ty rep_tycon
   = do { wrap_name <- newImplicitBinder src_name mkDataConWrapperOcc
        ; work_name <- newImplicitBinder src_name mkDataConWorkerOcc
        -- This last one takes the name of the data constructor in the source
@@ -202,21 +213,22 @@ buildDataCon src_name declared_infix arg_stricts field_lbls
        -- space, and puts it into the VarName name space
 
        ; let
-               stupid_ctxt = mkDataConStupidTheta tycon arg_tys univ_tvs
+               stupid_ctxt = mkDataConStupidTheta rep_tycon arg_tys univ_tvs
                data_con = mkDataCon src_name declared_infix
                                     arg_stricts field_lbls
                                     univ_tvs ex_tvs eq_spec ctxt
-                                    arg_tys tycon
+                                    arg_tys res_ty rep_tycon
                                     stupid_ctxt dc_ids
                dc_ids = mkDataConIds wrap_name work_name data_con
 
-       ; returnM data_con }
+       ; return data_con }
 
 
 -- The stupid context for a data constructor should be limited to
 -- the type variables mentioned in the arg_tys
 -- ToDo: Or functionally dependent on?  
 --      This whole stupid theta thing is, well, stupid.
+mkDataConStupidTheta :: TyCon -> [Type] -> [TyVar] -> [PredType]
 mkDataConStupidTheta tycon arg_tys univ_tvs
   | null stupid_theta = []     -- The common case
   | otherwise        = filter in_arg_tys stupid_theta
@@ -229,27 +241,22 @@ mkDataConStupidTheta tycon arg_tys univ_tvs
     arg_tyvars      = tyVarsOfTypes arg_tys
     in_arg_tys pred = not $ isEmptyVarSet $ 
                      tyVarsOfPred pred `intersectVarSet` arg_tyvars
-
-------------------------------------------------------
-mkTyConSelIds :: TyCon -> AlgTyConRhs -> [Id]
-mkTyConSelIds tycon rhs
-  =  [ mkRecordSelId tycon fld 
-     | fld <- nub (concatMap dataConFieldLabels (visibleDataCons rhs)) ]
-       -- We'll check later that fields with the same name 
-       -- from different constructors have the same type.
 \end{code}
 
 
 ------------------------------------------------------
 \begin{code}
-buildClass :: Name -> [TyVar] -> ThetaType
+buildClass :: Bool                     -- True <=> do not include unfoldings 
+                                       --          on dict selectors
+                                       -- Used when importing a class without -O
+          -> Name -> [TyVar] -> ThetaType
           -> [FunDep TyVar]            -- Functional dependencies
           -> [TyThing]                 -- Associated types
           -> [(Name, DefMeth, Type)]   -- Method info
           -> RecFlag                   -- Info for type constructor
           -> TcRnIf m n Class
 
-buildClass class_name tvs sc_theta fds ats sig_stuff tc_isrec
+buildClass no_unf class_name tvs sc_theta fds ats sig_stuff tc_isrec
   = do { traceIf (text "buildClass")
        ; tycon_name <- newImplicitBinder class_name mkClassTyConOcc
        ; datacon_name <- newImplicitBinder class_name mkClassDataConOcc
@@ -261,35 +268,53 @@ buildClass class_name tvs sc_theta fds ats sig_stuff tc_isrec
 
          let { rec_tycon  = classTyCon rec_clas
              ; op_tys     = [ty | (_,_,ty) <- sig_stuff]
-             ; op_items   = [ (mkDictSelId op_name rec_clas, dm_info)
+             ; op_names   = [op | (op,_,_) <- sig_stuff]
+             ; op_items   = [ (mkDictSelId no_unf op_name rec_clas, dm_info)
                             | (op_name, dm_info, _) <- sig_stuff ] }
                        -- Build the selector id and default method id
 
-       ; dict_con <- buildDataCon datacon_name
-                                  False        -- Not declared infix
-                                  (map (const NotMarkedStrict) op_tys)
-                                  [{- No labelled fields -}]
-                                  tvs [{- no existentials -}]
-                                   [{- No GADT equalities -}] sc_theta 
-                                   op_tys
-                                  rec_tycon
+       ; let n_value_preds   = count (not . isEqPred) sc_theta
+             all_value_preds = n_value_preds == length sc_theta
+             -- We only make selectors for the *value* superclasses, 
+             -- not equality predicates 
 
-       ; sc_sel_names <- mapM (newImplicitBinder class_name . mkSuperDictSelOcc) 
-                               [1..length (dataConDictTheta dict_con)]
+       ; sc_sel_names <- mapM  (newImplicitBinder class_name . mkSuperDictSelOcc) 
+                               [1..n_value_preds]
+        ; let sc_sel_ids = [mkDictSelId no_unf sc_name rec_clas | sc_name <- sc_sel_names]
              -- We number off the Dict superclass selectors, 1, 2, 3 etc so that we 
-             -- can construct names for the selectors.  Thus
+             -- can construct names for the selectors. Thus
              --      class (C a, C b) => D a b where ...
              -- gives superclass selectors
              --      D_sc1, D_sc2
              -- (We used to call them D_C, but now we can have two different
              --  superclasses both called C!)
-        ; let sc_sel_ids = [mkDictSelId sc_name rec_clas | sc_name <- sc_sel_names]
-
-               -- Use a newtype if the class constructor has exactly one field:
+             --
+       
+       ; let use_newtype = (n_value_preds + length sig_stuff == 1) && all_value_preds
+               -- Use a newtype if the data constructor has 
+               --      (a) exactly one value field
+               --      (b) no existential or equality-predicate fields
                -- i.e. exactly one operation or superclass taken together
-               -- Watch out: the sc_theta includes equality predicates,
-               --            which don't count for this purpose; hence dataConDictTheta
-       ; rhs <- if ((length $ dataConDictTheta dict_con) + length sig_stuff) == 1
+               -- See note [Class newtypes and equality predicates]
+
+               -- We play a bit fast and loose by treating the superclasses
+               -- as ordinary arguments.  That means that in the case of
+               --     class C a => D a
+               -- we don't get a newtype with no arguments!
+             args    = sc_sel_names ++ op_names
+             arg_tys = map mkPredTy sc_theta ++ op_tys
+
+       ; dict_con <- buildDataCon datacon_name
+                                  False        -- Not declared infix
+                                  (map (const HsNoBang) args)
+                                  [{- No fields -}]
+                                  tvs [{- no existentials -}]
+                                   [{- No GADT equalities -}] [{- No theta -}]
+                                   arg_tys
+                                  (mkTyConApp rec_tycon (mkTyVarTys tvs))
+                                  rec_tycon
+
+       ; rhs <- if use_newtype
                 then mkNewTyConRhs tycon_name rec_tycon dict_con
                 else return (mkDataTyConRhs [dict_con])
 
@@ -316,4 +341,19 @@ buildClass class_name tvs sc_theta fds ats sig_stuff tc_isrec
        })}
 \end{code}
 
+Note [Class newtypes and equality predicates]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Consider
+       class (a ~ F b) => C a b where
+         op :: a -> b
+
+We cannot represent this by a newtype, even though it's not
+existential, and there's only one value field, because we do
+capture an equality predicate:
+
+       data C a b where
+         MkC :: forall a b. (a ~ F b) => (a->b) -> C a b
+
+We need to access this equality predicate when we get passes a C
+dictionary.  See Trac #2238