
#16077: AvailTC Invariant being violated -------------------------------------+------------------------------------- Reporter: harpocrates | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.6.3 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- The `AvailTC Invariant` (from `basicTypes/Avail.hs`) states that: {{{ If the type or class is itself to be in scope, it must be *first* in this list. Thus, typically: @AvailTC Eq [Eq, ==, \/=]@ }}} Here is a case where this invariant is not upheld: * `pkgA/pkgA.cabal`: {{{ name: pkgA version: 1.0.0 build-type: Simple cabal-version: >= 1.2 library exposed-modules: A build-depends: base }}} * `pkgA/A.hs` {{{ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeFamilies #-} module A ( C(..) , T(TI) , error ) where class C a where data T a instance C Int where data T Int = TI { ti :: Int } }}} * `pkgB/pkgB.cabal` {{{ name: pkgB version: 1.0.0 build-type: Simple cabal-version: >= 1.2 library exposed-modules: B build-depends: base, pkgA }}} * `pkgB/B.hs` {{{ module B ( module A ) where import A hiding (error) }}} Now, check out the exports for `A` vs. `B`: {{{ $ cabal new-build pkgA pkgB --ghc-options -ddump-rn-trace | grep rnExports Warning: The package list for 'hackage.haskell.org' is 38 days old. Run 'cabal update' to get the latest list of available packages. rnExports: Exports: [error, C{C, T;}, T{T, TI;}] rnExports: Exports: [C{C, T;}, T{TI;}] }}} Why is `T{TI;}` in the second line not `T{T, TI;}`? Shouldn't the exports for `B` be identical to those for `A` (except for `error`)? This is causing a crash in Haddock: https://github.com/haskell/haddock/issues/979. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16077 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler