[project @ 2002-04-01 08:23:30 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcIfaceSig.lhs
index f710e45..50f2e8a 100644 (file)
@@ -4,7 +4,12 @@
 \section[TcIfaceSig]{Type checking of type signatures in interface files}
 
 \begin{code}
-module TcIfaceSig ( tcInterfaceSigs, tcVar, tcCoreExpr, tcCoreLamBndrs ) where
+module TcIfaceSig ( tcInterfaceSigs,
+                    tcDelay,
+                   tcVar,
+                   tcCoreExpr,
+                   tcCoreLamBndrs,
+                   tcCoreBinds ) where
 
 #include "HsVersions.h"
 
@@ -29,15 +34,15 @@ import Id           ( Id, mkVanillaGlobal, mkLocalId, idName, isDataConWrapId_maybe )
 import Module          ( Module )
 import MkId            ( mkFCallId )
 import IdInfo
+import TyCon           ( tyConDataCons )
 import DataCon         ( DataCon, dataConId, dataConSig, dataConArgTys )
-import Type            ( mkTyVarTys, splitAlgTyConApp_maybe )
+import Type            ( Type, mkTyVarTys, splitTyConApp )
 import TysWiredIn      ( tupleCon )
 import Var             ( mkTyVar, tyVarKind )
 import Name            ( Name, nameIsLocalOrFrom )
-import Demand          ( wwLazy )
 import ErrUtils                ( pprBagOfErrors )
 import Outputable      
-import Util            ( zipWithEqual )
+import Util            ( zipWithEqual, dropList, equalLength )
 import HscTypes                ( TyThing(..) )
 \end{code}
 
@@ -86,11 +91,9 @@ tcIdInfo unf_env in_scope_vars name ty info_ins
     init_info = vanillaIdInfo `setCgInfo` vanillaCgInfo
 
     tcPrag info (HsNoCafRefs)   = returnTc (info `setCafInfo`   NoCafRefs)
-    tcPrag info HsCprInfo       = returnTc (info `setCprInfo`   ReturnsCPR)
 
     tcPrag info (HsArity arity) = 
-       returnTc (info `setArityInfo` (ArityExactly arity)
-                      `setCgArity`   arity)
+       returnTc (info `setArityInfo` arity)
 
     tcPrag info (HsUnfold inline_prag expr)
        = tcPragExpr unf_env name in_scope_vars expr    `thenNF_Tc` \ maybe_expr' ->
@@ -106,7 +109,7 @@ tcIdInfo unf_env in_scope_vars name ty info_ins
          returnTc info2
 
     tcPrag info (HsStrictness strict_info)
-       = returnTc (info `setStrictnessInfo` strict_info)
+       = returnTc (info `setAllStrictnessInfo` Just strict_info)
 
     tcPrag info (HsWorker nm arity)
        = tcWorkerInfo unf_env ty info nm arity
@@ -114,7 +117,7 @@ tcIdInfo unf_env in_scope_vars name ty info_ins
 
 \begin{code}
 tcWorkerInfo unf_env ty info worker_name arity
-  = uniqSMToTcM (mkWrapper ty arity demands res_bot cpr_info) `thenNF_Tc` \ wrap_fn ->
+  = uniqSMToTcM (mkWrapper ty strict_sig) `thenNF_Tc` \ wrap_fn ->
     let
        -- Watch out! We can't pull on unf_env too eagerly!
        info' = case tcLookupRecId_maybe unf_env worker_name of
@@ -127,15 +130,11 @@ tcWorkerInfo unf_env ty info worker_name arity
     in
     returnTc info'
   where
-       -- We are relying here on cpr and strictness info always appearing 
+       -- We are relying here on strictness info always appearing 
        -- before worker info,  fingers crossed ....
-      cpr_info   = cprInfo info
-
-      (demands, res_bot)
-       = case strictnessInfo info of
-               StrictnessInfo d r -> (d,r)
-               _                  -> (take arity (repeat wwLazy),False)
-                                       -- Noncommittal
+      strict_sig = case newStrictnessInfo info of
+                       Just sig -> sig
+                       Nothing  -> pprPanic "Worker info but no strictness for" (ppr worker_name)
 \end{code}
 
 For unfoldings we try to do the job lazily, so that we never type check
@@ -143,24 +142,23 @@ an unfolding that isn't going to be looked at.
 
 \begin{code}
 tcPragExpr unf_env name in_scope_vars expr
-  = tcDelay unf_env doc $
+  = tcDelay unf_env doc Nothing $
        tcCoreExpr expr         `thenTc` \ core_expr' ->
 
                -- Check for type consistency in the unfolding
        tcGetSrcLoc             `thenNF_Tc` \ src_loc -> 
-       getDOptsTc              `thenTc` \ dflags ->
+       getDOptsTc              `thenNF_Tc` \ dflags ->
        case lintUnfolding dflags src_loc in_scope_vars core_expr' of
-         (Nothing,_)       -> returnTc core_expr'  -- ignore warnings
+         (Nothing,_)       -> returnTc (Just core_expr')  -- ignore warnings
          (Just fail_msg,_) -> failWithTc ((doc <+> text "failed Lint") $$ fail_msg)
   where
     doc = text "unfolding of" <+> ppr name
 
-tcDelay :: RecTcEnv -> SDoc -> TcM a -> NF_TcM (Maybe a)
-tcDelay unf_env doc thing_inside
+tcDelay :: RecTcEnv -> SDoc -> a -> TcM a -> NF_TcM a
+tcDelay unf_env doc bad_ans thing_inside
   = forkNF_Tc (
        recoverNF_Tc bad_value (
-               tcSetEnv unf_env thing_inside   `thenTc` \ r ->
-               returnTc (Just r)
+               tcSetEnv unf_env thing_inside
     ))                 
   where
        -- The trace tells what wasn't available, for the benefit of
@@ -168,7 +166,7 @@ tcDelay unf_env doc thing_inside
     bad_value = getErrsTc              `thenNF_Tc` \ (warns,errs) ->
                returnNF_Tc (pprTrace "Failed:" 
                                         (hang doc 4 (pprBagOfErrors errs))
-                                        Nothing)
+                                        bad_ans)
 \end{code}
 
 
@@ -225,7 +223,7 @@ tcCoreExpr (UfTuple (HsTupCon _ boxity arity) args)
     in
     returnTc (mkApps (Var con_id) con_args)
   where
-    con_id = dataConId (tupleCon boxity arity)
+    con_id = dataConWorkId (tupleCon boxity arity)
     
 
 tcCoreExpr (UfLam bndr body)
@@ -337,18 +335,17 @@ tcCoreAlt scrut_ty (UfLitLitAlt str ty, names, rhs)
 tcCoreAlt scrut_ty alt@(con, names, rhs)
   = tcConAlt con       `thenTc` \ con ->
     let
-       (main_tyvars, _, ex_tyvars, _, _, _) = dataConSig con
-
-       (_, inst_tys, cons) = case splitAlgTyConApp_maybe scrut_ty of
-                                   Just stuff -> stuff
-                                   Nothing -> pprPanic "tcCoreAlt" (ppr alt)
-       ex_tyvars'          = [mkTyVar name (tyVarKind tv) | (name,tv) <- names `zip` ex_tyvars] 
-       ex_tys'             = mkTyVarTys ex_tyvars'
-       arg_tys             = dataConArgTys con (inst_tys ++ ex_tys')
-       id_names            = drop (length ex_tyvars) names
+       ex_tyvars         = dataConExistentialTyVars con
+       (tycon, inst_tys) = splitTyConApp scrut_ty      -- NB: not tcSplitTyConApp
+                                                       -- We are looking at Core here
+       main_tyvars       = tyConTyVars tycon
+       ex_tyvars'        = [mkTyVar name (tyVarKind tv) | (name,tv) <- names `zip` ex_tyvars] 
+       ex_tys'           = mkTyVarTys ex_tyvars'
+       arg_tys           = dataConArgTys con (inst_tys ++ ex_tys')
+       id_names          = dropList ex_tyvars names
        arg_ids
 #ifdef DEBUG
-               | length id_names /= length arg_tys
+               | not (equalLength id_names arg_tys)
                = pprPanic "tcCoreAlts" (ppr (con, names, rhs) $$
                                         (ppr main_tyvars <+> ppr ex_tyvars) $$
                                         ppr arg_tys)
@@ -356,7 +353,7 @@ tcCoreAlt scrut_ty alt@(con, names, rhs)
 #endif
                = zipWithEqual "tcCoreAlts" mkLocalId id_names arg_tys
     in
-    ASSERT( con `elem` cons && length inst_tys == length main_tyvars )
+    ASSERT( con `elem` tyConDataCons tycon && equalLength inst_tys main_tyvars )
     tcExtendTyVarEnv ex_tyvars'                        $
     tcExtendGlobalValEnv arg_ids               $
     tcCoreExpr rhs                                     `thenTc` \ rhs' ->
@@ -374,6 +371,28 @@ tcConAlt (UfDataAlt con_name)
                    Nothing  -> pprPanic "tcCoreAlt" (ppr con_id))
 \end{code}
 
+%************************************************************************
+%*                                                                     *
+\subsection{Core decls}
+%*                                                                     *
+%************************************************************************
+
+
+\begin{code}
+tcCoreBinds :: [RenamedTyClDecl]
+            -> TcM [(Id, Type, CoreExpr)]
+tcCoreBinds ls = mapTc tcOne ls
+ where
+  tcOne (CoreDecl { tcdName = nm, tcdType = ty, tcdRhs = rhs }) =
+   tcVar nm         `thenTc` \ i ->
+   tcIfaceType ty   `thenTc` \ ty' ->
+   tcCoreExpr  rhs  `thenTc` \ rhs' ->
+   returnTc (i,ty',rhs')
+
+\end{code}
+
+
+
 \begin{code}
 ifaceSigCtxt sig_name
   = hsep [ptext SLIT("In an interface-file signature for"), ppr sig_name]