(Alas, Darcs failed to record my log-message for the above patch,
so this patch is an attempt to add the log message retrospectively.)
Roman found a case where the type-checker for interface files
would go into a loop. Here it is:
module BarAT where
class Foo a where
data FooT a :: *
int :: FooT a -> Int
module Baz where
import BarAT
foo :: FooT Int -> Int
foo = foo
The trouble turned out to be that Foo gives rise to a *newtype*,
and using a newtpe caused a little bit too much strictness in
BuildTyCl.mkNewTyConRhs. Specifically, mkNewTypeCoercion did pattern
matching, which forced the call to eta_reduce in mkNewTyConRhs.
This is all too delicate really. But for now I've fixed the bug,
and added an explanatory comment. I'll add a test for it, in
indexed-types/should_compile/ATLoop
etad_rhs :: Type -- return a TyCon without pulling on rhs_ty
-- See Note [Tricky iface loop] in LoadIface
(etad_tvs, etad_rhs) = eta_reduce (reverse tvs) rhs_ty
-
+
eta_reduce :: [TyVar] -- Reversed
-> Type -- Rhs type
-> ([TyVar], Type) -- Eta-reduced version (tyvars in normal order)