{-# LANGUAGE TypeFamilies, PolyKinds #-} module T6018rnfail where -- IA = injectivity annotation `| foo -> bar` -- use incorrect tyvar in LHS of IA type family F a = r | a -> a type family Fc a = r | a -> a where Fc a = a class Fcl a where type Ft a = r | a -> a -- declare result tyvar to be duplicate (without IA) type family G a = a type family Gc a = a where Gc a = a -- declare result tyvar to be duplicate (with IA) type family Gb a = a | a -> a type family Gcb a = a | a -> a where Gcb a = a class Gclb a where -- here we want two errors type Gtb a = a | a -> a -- not in-scope tyvar in RHS of IA type family I a b = r | r -> c type family Ic a b = r | r -> c where Ic a b = a class Icl a b where type It a b = r | r -> c -- not in-scope tyvar in LHS of IA type family L a b = r | c -> a type family Lc a b = r | c -> a where Lc a b = a class Lcl a b where type Lt a b = r | c -> a -- result variable shadows variable in class head class M a b where type Mt b = a | a -> b -- here b is out-of-scope class N a b where type Nt a = r | r -> a b -- result is out of scope. Not possible for associated types type family O1 a | r -> a type family Oc1 a | r -> a where Oc1 a = a type family O2 a :: * | r -> a type family Oc2 a :: * | r -> a where Oc2 a = a