diff options
author | simonpj <unknown> | 2001-08-23 08:43:30 +0000 |
---|---|---|
committer | simonpj <unknown> | 2001-08-23 08:43:30 +0000 |
commit | de568761513c59bef17bb3bf2285f6c9d457bddf (patch) | |
tree | ed22668dbb2a5c3981b79cdcba62fa6489cc83fe | |
parent | b10453960968ee8fc39fb6bf371d466e3e7aedaf (diff) | |
download | haskell-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.lhs | 17 |
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 |