Skip to content

Combine GREs when combining in mkImportOccEnv

sheaf requested to merge sheaf/ghc:T24084 into master

In GHC.Rename.Names.mkImportOccEnv, we sometimes discard one import item in favour of another, as explained in Note [Dealing with imports] in GHC.Rename.Names. However, this can cause us to lose track of important parent information.

Consider for example #24084 (closed):

module M1 where { class C a where { type T a } }
module M2 ( module M1 ) where { import M1 }
module M3 where { import M2 ( C, T ); instance C () where T () = () }

When processing the import list of M3, we start off (for reasons that are not relevant right now) with two Avails attached to T, namely C(C, T) and T(T). We combine them in the combine function of mkImportOccEnv; as described in Note [Dealing with imports] we discard C(C, T) in favour of T(T). However, in doing so, we must not discard the information want that C is the parent of T. Indeed, losing track of this information can cause errors when importing, as we could get an error of the form

‘T’ is not a (visible) associated type of class ‘C’

We fix this by combining the two GREs for T using plusGRE.

Edited by sheaf

Merge request reports