Skip to content

bad variable escape analysis when TypeFamilies are enabled

The following minimal example causes a type error in 7.3.20110927:

{-# LANGUAGE TypeFamilies #-}

class Foo a where
	foo :: a -> a

instance (Foo a, Foo b) => Foo (a, b) where
	foo = foo' ()

foo' es = const id (unitId es)

unitId :: () -> ()
unitId = id

Specifically, the error given is:

test.hs:6:10:
    Couldn't match type `a0' with `(a, b)'
      because type variables `a', `b' would escape their scope
    These (rigid, skolem) type variables are bound by
      the instance declaration
    The following variables have types that mention a0
      foo' :: () -> a0 -> a0 (bound at test.hs:9:1)
    In the instance declaration for `Foo (a, b)'

This code compiles successfully as recently as 7.3.20110726 (though I haven't tested any GHC versions in between these two).

Trac metadata
Trac field Value
Version 7.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information