[project @ 2000-09-28 13:04:14 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcExpr.lhs
index e556db1..802620b 100644 (file)
@@ -9,20 +9,17 @@ module TcExpr ( tcApp, tcExpr, tcPolyExpr, tcId ) where
 #include "HsVersions.h"
 
 import HsSyn           ( HsExpr(..), HsLit(..), ArithSeqInfo(..), 
-                         HsBinds(..), MonoBinds(..), Stmt(..), StmtCtxt(..),
-                         mkMonoBind, nullMonoBinds
+                         MonoBinds(..), StmtCtxt(..),
+                         mkMonoBind, nullMonoBinds 
                        )
 import RnHsSyn         ( RenamedHsExpr, RenamedRecordBinds )
-import TcHsSyn         ( TcExpr, TcRecordBinds, mkHsConApp,
-                         mkHsTyApp, mkHsLet
-                       )
+import TcHsSyn         ( TcExpr, TcRecordBinds, mkHsTyApp, mkHsLet )
 
 import TcMonad
 import BasicTypes      ( RecFlag(..) )
 
-import Inst            ( Inst, InstOrigin(..), OverloadedLit(..),
-                         LIE, emptyLIE, unitLIE, consLIE, plusLIE, plusLIEs,
-                         lieToList, listToLIE,
+import Inst            ( InstOrigin(..), 
+                         LIE, emptyLIE, unitLIE, plusLIE, plusLIEs,
                          newOverloadedLit, newMethod, newIPDict,
                          instOverloadedFun, newDicts, newClassDicts,
                          getIPsOfLIE, instToId, ipToId
@@ -32,53 +29,43 @@ import TcEnv                ( tcInstId,
                          tcLookupValue, tcLookupClassByKey,
                          tcLookupValueByKey,
                          tcExtendGlobalTyVars, tcLookupValueMaybe,
-                         tcLookupTyCon, tcLookupDataCon
+                         tcLookupTyConByKey, tcLookupDataCon
                        )
 import TcMatches       ( tcMatchesCase, tcMatchLambda, tcStmts )
 import TcMonoType      ( tcHsSigType, checkSigTyVars, sigCtxt )
-import TcPat           ( badFieldCon )
-import TcSimplify      ( tcSimplify, tcSimplifyAndCheck, partitionPredsOfLIE )
+import TcPat           ( badFieldCon, simpleHsLitTy )
+import TcSimplify      ( tcSimplifyAndCheck, partitionPredsOfLIE )
 import TcImprove       ( tcImprove )
 import TcType          ( TcType, TcTauType,
                          tcInstTyVars,
                          tcInstTcType, tcSplitRhoTy,
-                         newTyVarTy, newTyVarTy_OpenKind, zonkTcType )
+                         newTyVarTy, newTyVarTys, zonkTcType )
 
-import Class           ( Class )
-import FieldLabel      ( FieldLabel, fieldLabelName, fieldLabelType, fieldLabelTyCon )
-import Id              ( idType, recordSelectorFieldLabel, isRecordSelector,
-                         Id, mkVanillaId
-                       )
+import FieldLabel      ( fieldLabelName, fieldLabelType, fieldLabelTyCon )
+import Id              ( idType, recordSelectorFieldLabel, isRecordSelector, mkVanillaId )
 import DataCon         ( dataConFieldLabels, dataConSig, 
                          dataConStrictMarks, StrictnessMark(..)
                        )
 import Name            ( Name, getName )
-import Type            ( mkFunTy, mkAppTy, mkTyVarTy, mkTyVarTys,
-                         ipName_maybe,
+import Type            ( mkFunTy, mkAppTy, mkTyVarTys, ipName_maybe,
                          splitFunTy_maybe, splitFunTys, isNotUsgTy,
                          mkTyConApp, splitSigmaTy, 
                          splitRhoTy,
                          isTauTy, tyVarsOfType, tyVarsOfTypes, 
                          isSigmaTy, splitAlgTyConApp, splitAlgTyConApp_maybe,
-                         boxedTypeKind, mkArrowKind,
+                         boxedTypeKind, openTypeKind, mkArrowKind,
                          tidyOpenType
                        )
 import TyCon           ( TyCon, tyConTyVars )
 import Subst           ( mkTopTyVarSubst, substClasses, substTy )
 import UsageSPUtils     ( unannotTy )
-import VarSet          ( emptyVarSet, unionVarSet, elemVarSet, mkVarSet )
-import TyCon           ( tyConDataCons )
-import TysPrim         ( intPrimTy, charPrimTy, doublePrimTy,
-                         floatPrimTy, addrPrimTy
-                       )
-import TysWiredIn      ( boolTy, charTy, stringTy )
-import PrelInfo                ( ioTyCon_NAME )
-import TcUnify         ( unifyTauTy, unifyFunTy, unifyListTy, unifyTupleTy,
-                         unifyUnboxedTupleTy )
-import Unique          ( cCallableClassKey, cReturnableClassKey, 
+import VarSet          ( elemVarSet, mkVarSet )
+import TysWiredIn      ( boolTy )
+import TcUnify         ( unifyTauTy, unifyFunTy, unifyListTy, unifyTupleTy )
+import PrelNames       ( cCallableClassKey, cReturnableClassKey, 
                          enumFromClassOpKey, enumFromThenClassOpKey,
                          enumFromToClassOpKey, enumFromThenToClassOpKey,
-                         thenMClassOpKey, failMClassOpKey, returnMClassOpKey
+                         thenMClassOpKey, failMClassOpKey, returnMClassOpKey, ioTyConKey
                        )
 import Outputable
 import Maybes          ( maybeToBool, mapMaybe )
@@ -101,7 +88,7 @@ tcExpr :: RenamedHsExpr                      -- Expession to type check
 
 tcExpr expr ty | isSigmaTy ty = -- Polymorphic case
                                tcPolyExpr expr ty      `thenTc` \ (expr', lie, _, _, _) ->
-                                returnTc (expr', lie)
+                               returnTc (expr', lie)
 
               | otherwise    = -- Monomorphic case
                                tcMonoExpr expr ty
@@ -210,88 +197,17 @@ tcMonoExpr (HsIPVar name) res_ty
 
 %************************************************************************
 %*                                                                     *
-\subsection{Literals}
-%*                                                                     *
-%************************************************************************
-
-Overloaded literals.
-
-\begin{code}
-tcMonoExpr (HsLit (HsInt i)) res_ty
-  = newOverloadedLit (LiteralOrigin (HsInt i))
-                    (OverloadedIntegral i)
-                    res_ty  `thenNF_Tc` \ stuff ->
-    returnTc stuff
-
-tcMonoExpr (HsLit (HsFrac f)) res_ty
-  = newOverloadedLit (LiteralOrigin (HsFrac f))
-                    (OverloadedFractional f)
-                    res_ty  `thenNF_Tc` \ stuff ->
-    returnTc stuff
-
-
-tcMonoExpr (HsLit lit@(HsLitLit s)) res_ty
-  = tcLookupClassByKey cCallableClassKey               `thenNF_Tc` \ cCallableClass ->
-    newClassDicts (LitLitOrigin (_UNPK_ s))
-                 [(cCallableClass,[res_ty])]           `thenNF_Tc` \ (dicts, _) ->
-    returnTc (HsLitOut lit res_ty, dicts)
-\end{code}
-
-Primitive literals:
-
-\begin{code}
-tcMonoExpr (HsLit lit@(HsCharPrim c)) res_ty
-  = unifyTauTy res_ty charPrimTy               `thenTc_`
-    returnTc (HsLitOut lit charPrimTy, emptyLIE)
-
-tcMonoExpr (HsLit lit@(HsStringPrim s)) res_ty
-  = unifyTauTy res_ty addrPrimTy               `thenTc_`
-    returnTc (HsLitOut lit addrPrimTy, emptyLIE)
-
-tcMonoExpr (HsLit lit@(HsIntPrim i)) res_ty
-  = unifyTauTy res_ty intPrimTy                `thenTc_`
-    returnTc (HsLitOut lit intPrimTy, emptyLIE)
-
-tcMonoExpr (HsLit lit@(HsFloatPrim f)) res_ty
-  = unifyTauTy res_ty floatPrimTy              `thenTc_`
-    returnTc (HsLitOut lit floatPrimTy, emptyLIE)
-
-tcMonoExpr (HsLit lit@(HsDoublePrim d)) res_ty
-  = unifyTauTy res_ty doublePrimTy             `thenTc_`
-    returnTc (HsLitOut lit doublePrimTy, emptyLIE)
-\end{code}
-
-Unoverloaded literals:
-
-\begin{code}
-tcMonoExpr (HsLit lit@(HsChar c)) res_ty
-  = unifyTauTy res_ty charTy           `thenTc_`
-    returnTc (HsLitOut lit charTy, emptyLIE)
-
-tcMonoExpr (HsLit lit@(HsString str)) res_ty
-  = unifyTauTy res_ty stringTy                 `thenTc_`
-    returnTc (HsLitOut lit stringTy, emptyLIE)
-\end{code}
-
-%************************************************************************
-%*                                                                     *
 \subsection{Other expression forms}
 %*                                                                     *
 %************************************************************************
 
 \begin{code}
-tcMonoExpr (HsPar expr) res_ty -- preserve parens so printing needn't guess where they go
-  = tcMonoExpr expr res_ty
-
--- perform the negate *before* overloading the integer, since the case
--- of minBound on Ints fails otherwise.  Could be done elsewhere, but
--- convenient to do it here.
+tcMonoExpr (HsLit lit)     res_ty = tcLit lit res_ty
+tcMonoExpr (HsOverLit lit) res_ty = newOverloadedLit (LiteralOrigin lit) lit res_ty
+tcMonoExpr (HsPar expr)    res_ty = tcMonoExpr expr res_ty
 
-tcMonoExpr (NegApp (HsLit (HsInt i)) neg) res_ty
-  = tcMonoExpr (HsLit (HsInt (-i))) res_ty
-
-tcMonoExpr (NegApp expr neg) res_ty 
-  = tcMonoExpr (HsApp neg expr) res_ty
+tcMonoExpr (NegApp expr neg) res_ty
+  = tcMonoExpr (HsApp (HsVar neg) expr) res_ty
 
 tcMonoExpr (HsLam match) res_ty
   = tcMatchLambda match res_ty                 `thenTc` \ (match',lie) ->
@@ -359,7 +275,7 @@ tcMonoExpr (HsCCall lbl args may_gc is_asm ignored_fake_result_ty) res_ty
   =    -- Get the callable and returnable classes.
     tcLookupClassByKey cCallableClassKey       `thenNF_Tc` \ cCallableClass ->
     tcLookupClassByKey cReturnableClassKey     `thenNF_Tc` \ cReturnableClass ->
-    tcLookupTyCon ioTyCon_NAME                 `thenNF_Tc` \ ioTyCon ->
+    tcLookupTyConByKey ioTyConKey              `thenNF_Tc` \ ioTyCon ->
     let
        new_arg_dict (arg, arg_ty)
          = newClassDicts (CCallOrigin (_UNPK_ lbl) (Just arg))
@@ -374,7 +290,7 @@ tcMonoExpr (HsCCall lbl args may_gc is_asm ignored_fake_result_ty) res_ty
        tv_idxs | n_args == 0 = []
                | otherwise   = [1..n_args]
     in
-    mapNF_Tc (\ _ -> newTyVarTy_OpenKind) tv_idxs      `thenNF_Tc` \ arg_tys ->
+    newTyVarTys (length tv_idxs) openTypeKind          `thenNF_Tc` \ arg_tys ->
     tcMonoExprs args arg_tys                           `thenTc`    \ (args', args_lie) ->
 
        -- The argument types can be unboxed or boxed; the result
@@ -462,15 +378,12 @@ tcMonoExpr in_expr@(ExplicitList exprs) res_ty    -- Non-empty list
       = tcAddErrCtxt (listCtxt expr) $
        tcMonoExpr expr elt_ty
 
-tcMonoExpr (ExplicitTuple exprs boxed) res_ty
-  = (if boxed
-       then unifyTupleTy (length exprs) res_ty
-       else unifyUnboxedTupleTy (length exprs) res_ty
-                                               ) `thenTc` \ arg_tys ->
+tcMonoExpr (ExplicitTuple exprs boxity) res_ty
+  = unifyTupleTy boxity (length exprs) res_ty  `thenTc` \ arg_tys ->
     mapAndUnzipTc (\ (expr, arg_ty) -> tcMonoExpr expr arg_ty)
                (exprs `zip` arg_tys) -- we know they're of equal length.
                                                        `thenTc` \ (exprs', lies) ->
-    returnTc (ExplicitTuple exprs' boxed, plusLIEs lies)
+    returnTc (ExplicitTuple exprs' boxity, plusLIEs lies)
 
 tcMonoExpr expr@(RecordCon con_name rbinds) res_ty
   = tcAddErrCtxt (recordConCtxt expr)          $
@@ -753,7 +666,7 @@ tcMonoExpr (HsWith expr binds) res_ty
        revBinds b = b
 
 tcIPBinds ((name, expr) : binds)
-  = newTyVarTy_OpenKind                `thenTc` \ ty ->
+  = newTyVarTy openTypeKind    `thenTc` \ ty ->
     tcGetSrcLoc                        `thenTc` \ loc ->
     let id = ipToId name ty loc in
     tcMonoExpr expr ty         `thenTc` \ (expr', lie) ->
@@ -788,7 +701,7 @@ tcExpr_id id_expr
  = case id_expr of
        HsVar name -> tcId name                 `thenNF_Tc` \ stuff -> 
                      returnTc stuff
-       other      -> newTyVarTy_OpenKind       `thenNF_Tc` \ id_ty ->
+       other      -> newTyVarTy openTypeKind   `thenNF_Tc` \ id_ty ->
                      tcMonoExpr id_expr id_ty  `thenTc`    \ (id_expr', lie_id) ->
                      returnTc (id_expr', lie_id, id_ty) 
 \end{code}
@@ -827,7 +740,7 @@ tcApp fun args res_ty
     -- Check that the result type doesn't have any nested for-alls.
     -- For example, a "build" on its own is no good; it must be applied to something.
     checkTc (isTauTy actual_result_ty)
-           (lurkingRank2Err fun fun_ty)        `thenTc_`
+           (lurkingRank2Err fun actual_result_ty)      `thenTc_`
 
     returnTc (fun', args', lie_fun `plusLIE` plusLIEs lie_args_s)
 
@@ -897,11 +810,11 @@ tcId name
     tcLookupValueMaybe name    `thenNF_Tc` \ maybe_local ->
 
     case maybe_local of
-      Just tc_id -> instantiate_it (OccurrenceOf tc_id) (HsVar tc_id) (unannotTy (idType tc_id))
+      Just tc_id -> instantiate_it (OccurrenceOf tc_id) tc_id (unannotTy (idType tc_id))
 
       Nothing ->    tcLookupValue name         `thenNF_Tc` \ id ->
                    tcInstId id                 `thenNF_Tc` \ (tyvars, theta, tau) ->
-                   instantiate_it2 (OccurrenceOf id) (HsVar id) tyvars theta tau
+                   instantiate_it2 (OccurrenceOf id) id tyvars theta tau
 
   where
        -- The instantiate_it loop runs round instantiating the Id.
@@ -917,7 +830,7 @@ tcId name
 
     instantiate_it2 orig fun tyvars theta tau
       = if null theta then     -- Is it overloaded?
-               returnNF_Tc (mkHsTyApp fun arg_tys, emptyLIE, tau)
+               returnNF_Tc (mkHsTyApp (HsVar fun) arg_tys, emptyLIE, tau)
        else
                -- Yes, it's overloaded
        instOverloadedFun orig fun arg_tys theta tau    `thenNF_Tc` \ (fun', lie1) ->
@@ -1085,12 +998,36 @@ tcMonoExprs (expr:exprs) (ty:tys)
 \end{code}
 
 
-% =================================================
+%************************************************************************
+%*                                                                     *
+\subsection{Literals}
+%*                                                                     *
+%************************************************************************
 
-Errors and contexts
-~~~~~~~~~~~~~~~~~~~
+Overloaded literals.
+
+\begin{code}
+tcLit :: HsLit -> TcType -> TcM s (TcExpr, LIE)
+tcLit (HsLitLit s _) res_ty
+  = tcLookupClassByKey cCallableClassKey               `thenNF_Tc` \ cCallableClass ->
+    newClassDicts (LitLitOrigin (_UNPK_ s))
+                 [(cCallableClass,[res_ty])]           `thenNF_Tc` \ (dicts, _) ->
+    returnTc (HsLit (HsLitLit s res_ty), dicts)
+
+tcLit lit res_ty 
+  = unifyTauTy res_ty (simpleHsLitTy lit)              `thenTc_`
+    returnTc (HsLit lit, emptyLIE)
+\end{code}
+
+
+%************************************************************************
+%*                                                                     *
+\subsection{Errors and contexts}
+%*                                                                     *
+%************************************************************************
 
 Mini-utils:
+
 \begin{code}
 pp_nest_hang :: String -> SDoc -> SDoc
 pp_nest_hang lbl stuff = nest 2 (hang (text lbl) 4 stuff)
@@ -1144,10 +1081,7 @@ appCtxt fun args
 lurkingRank2Err fun fun_ty
   = hang (hsep [ptext SLIT("Illegal use of"), quotes (ppr fun)])
         4 (vcat [ptext SLIT("It is applied to too few arguments"),  
-                 ptext SLIT("so that the result type has for-alls in it")])
-
-rank2ArgCtxt arg expected_arg_ty
-  = ptext SLIT("In a polymorphic function argument:") <+> ppr arg
+                 ptext SLIT("so that the result type has for-alls in it:") <+> ppr fun_ty])
 
 badFieldsUpd rbinds
   = hang (ptext SLIT("No constructor has all these fields:"))
@@ -1161,15 +1095,6 @@ recordConCtxt expr = ptext SLIT("In the record construction:") <+> ppr expr
 notSelector field
   = hsep [quotes (ppr field), ptext SLIT("is not a record selector")]
 
-illegalCcallTyErr isArg ty
-  = hang (hsep [ptext SLIT("Unacceptable"), arg_or_res, ptext SLIT("type in _ccall_ or _casm_:")])
-        4 (hsep [ppr ty])
-  where
-   arg_or_res
-    | isArg     = ptext SLIT("argument")
-    | otherwise = ptext SLIT("result")
-
-
 missingStrictFieldCon :: Name -> Name -> SDoc
 missingStrictFieldCon con field
   = hsep [ptext SLIT("Constructor") <+> quotes (ppr con),