summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsimonpj <unknown>2001-08-23 08:43:30 +0000
committersimonpj <unknown>2001-08-23 08:43:30 +0000
commitde568761513c59bef17bb3bf2285f6c9d457bddf (patch)
treeed22668dbb2a5c3981b79cdcba62fa6489cc83fe
parentb10453960968ee8fc39fb6bf371d466e3e7aedaf (diff)
downloadhaskell-de568761513c59bef17bb3bf2285f6c9d457bddf.tar.gz
[project @ 2001-08-23 08:43:30 by simonpj]
----------------------------------- Correct a horrible error in repType ----------------------------------- repType is meant to give the underlying representation of a type. But it wasn't taking account of the fact that *recursive* newtypes are still represented by a TyConApp. (Non-recursive ones behave much more like type synonyms now.) As a result, if we have newtype F = F (F->F) then Bad Things happen if we try to seq x::F. We decide whether to push an ordinary return address or a SEQ frame based on the type, and repType didn't expose the fact that F is represented by a function type. Aargh. codeGen/should_run/cg050 now tests for this.
-rw-r--r--ghc/compiler/types/Type.lhs17
1 files changed, 12 insertions, 5 deletions
diff --git a/ghc/compiler/types/Type.lhs b/ghc/compiler/types/Type.lhs
index be39f10f39..33cd4b138a 100644
--- a/ghc/compiler/types/Type.lhs
+++ b/ghc/compiler/types/Type.lhs
@@ -398,15 +398,22 @@ repType looks through
(b) synonyms
(c) predicates
(d) usage annotations
+ (e) [recursive] newtypes
It's useful in the back end.
+Remember, non-recursive newtypes get expanded as part of the SourceTy case,
+but recursive ones are represented by TyConApps and have to be expanded
+by steam.
+
\begin{code}
repType :: Type -> Type
-repType (ForAllTy _ ty) = repType ty
-repType (NoteTy _ ty) = repType ty
-repType (SourceTy p) = repType (sourceTypeRep p)
-repType (UsageTy _ ty) = repType ty
-repType ty = ty
+repType (ForAllTy _ ty) = repType ty
+repType (NoteTy _ ty) = repType ty
+repType (SourceTy p) = repType (sourceTypeRep p)
+repType (UsageTy _ ty) = repType ty
+repType (TyConApp tc tys) | isNewTyCon tc && length tys == tyConArity tc
+ = repType (newTypeRep tc tys)
+repType ty = ty
splitRepFunTys :: Type -> ([Type], Type)
-- Like splitFunTys, but looks through newtypes and for-alls