Commit de568761 authored by simonpj's avatar simonpj
Browse files

[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.
parent b1045396
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment