-----------------------------------
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.
(b) synonyms
(c) predicates
(d) usage annotations
(b) synonyms
(c) predicates
(d) usage annotations
+ (e) [recursive] newtypes
It's useful in the back end.
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
\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
splitRepFunTys :: Type -> ([Type], Type)
-- Like splitFunTys, but looks through newtypes and for-alls