[project @ 2003-10-22 16:25:42 by simonpj]
authorsimonpj <unknown>
Wed, 22 Oct 2003 16:25:43 +0000 (16:25 +0000)
committersimonpj <unknown>
Wed, 22 Oct 2003 16:25:43 +0000 (16:25 +0000)
Do foralls right in the renamer

ghc/compiler/hsSyn/HsTypes.lhs
ghc/compiler/rename/RnTypes.lhs
ghc/compiler/typecheck/TcHsType.lhs

index e3e2262..d3661cb 100644 (file)
@@ -8,7 +8,8 @@ module HsTypes (
          HsType(..), HsTyVarBndr(..), HsExplicitForAll(..),
        , HsContext, HsPred(..)
 
-       , mkExplicitHsForAllTy, mkImplicitHsForAllTy, mkHsDictTy, mkHsIParamTy
+       , mkExplicitHsForAllTy, mkImplicitHsForAllTy, 
+       , mkHsDictTy, mkHsIParamTy
        , hsTyVarName, hsTyVarNames, replaceTyVarName
        , splitHsInstDeclTy
        
index cf998b6..227cce5 100644 (file)
@@ -167,11 +167,22 @@ rnHsTypes doc tys = mappM (rnHsType doc) tys
 
 
 \begin{code}
+rnForAll doc exp [] [] ty = rnHsType doc ty
+       -- One reason for this case is that a type like Int#
+       -- starts of as (HsForAllTy Nothing [] Int), in case
+       -- there is some quantification.  Now that we have quantified
+       -- and discovered there are no type variables, it's nicer to turn
+       -- it into plain Int.  If it were Int# instead of Int, we'd actually
+       -- get an error, because the body of a genuine for-all is
+       -- of kind *.
+
 rnForAll doc exp forall_tyvars ctxt ty
   = bindTyVarsRn doc forall_tyvars     $ \ new_tyvars ->
     rnContext doc ctxt                 `thenM` \ new_ctxt ->
     rnHsType doc ty                    `thenM` \ new_ty ->
     returnM (HsForAllTy exp new_tyvars new_ctxt new_ty)
+       -- Retain the same implicit/explicit flag as before
+       -- so that we can later print it correctly
 \end{code}
 
 
index d85c492..7e9338f 100644 (file)
@@ -218,6 +218,7 @@ kcTypeType ty
        return ty'
     else
     newOpenTypeKind                            `thenM` \ type_kind ->
+    traceTc (text "kcTypeType" $$ nest 2 (ppr ty $$ ppr ty' $$ ppr kind $$ ppr type_kind)) `thenM_`
     checkExpectedKind (ppr ty) kind type_kind  `thenM_`
     returnM ty'