[GHC] #11124: GHC does not shadow -package-name/-this-package-key

#11124: GHC does not shadow -package-name/-this-package-key -------------------------------------+------------------------------------- Reporter: ezyang | Owner: Type: bug | Status: new Priority: low | Milestone: Component: Package | Version: 7.11 system | Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: GHC accepts Unknown/Multiple | invalid program Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Steps to reproduce: 1. Install a package named `a` with these contents: **a.cabal** {{{ name: a version: 0.1.0.0 cabal-version: >=1.10 library exposed-modules: A build-depends: base }}} **A.hs** {{{ module A where data A = A String }}} Note what unit ID/package key/package name the package installs as. On GHC 7.8 it will be something like `a-0.1.0.0`, on GHC 7.10 it will be something like `a_LKCPrTJwOTOLk4OU37YmeN`, on GHC 8.0 it will be something like `a-0.1.0.0-LKCPrTJwOTOLk4OU37Yme`. 2. Install a package named `b` with these contents: **b.cabal** {{{ name: b version: 0.1.0.0 cabal-version: >=1.10 library exposed-modules: B build-depends: base, a }}} **b.hs** {{{ module B where import A b = A "foo" }}} 3. Go back to `a`, and load `A.hs` in GHCi with `ghci A.hs -package-name a-0.1.0.0 -package-db ../db`. Notice that we can `import B` from this GHCi session: {{{ ezyang@sabre:~/Dev/labs/ii/a$ ghci A.hs -package-name a-0.1.0.0 -package- db ../db GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling A ( A.hs, interpreted ) Ok, modules loaded: A. *A> import B *A B> b Loading package a-0.1.0.0 ... linking ... done. Loading package b-0.1.0.0 ... linking ... done. A "asdfsdf" *A B> Leaving GHCi. }}} 3. Edit `A.hs` so that now contains: {{{ module A where data A = A Int }}} 4. Load in GHCi again: {{{ ezyang@sabre:~/Dev/labs/ii/a$ ghci A.hs -package-name a-0.1.0.0 -package- db ../db GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling A ( A.hs, interpreted ) Ok, modules loaded: A. *A> import B *A B> b Loading package a-0.1.0.0 ... linking ... done. Loading package b-0.1.0.0 ... linking ... done. A 3458765062984598387 }}} Disaster! Actually, this bug is relatively harmless: 1. If you try to actually reinstall package a, that's a "dangerous" reinstall and it's known that reinstalls can break things. 2. It's hard to convince Cabal to trigger this, since importing `B` requires `b` in the build-depends, and that would constitute a circular package dependency. (You can't separate it out because of (1)) 3. If you don't specify `-package-name` (or similar) the local `A` and the remote `A` will have different identities, no problem. 4. When you do specify `-package-name`, you can't build a main executable (so the only way to run is by loading into GHCi, as shown above.) 5. Sometimes, GHCi will notice that something is amiss if it tries to load the object file for both the remote A and the local A. But the fix seems simple: if a user specifies `-package-name`, it should be AS IF they also specified `-ignore-package`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11124 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC