[GHC] #12485: -package-db flags now need to be sorted by dependency order

GHC ghc-devs at haskell.org
Sat Oct 1 08:36:28 UTC 2016


#12485: -package-db flags now need to be sorted by dependency order
-------------------------------------+-------------------------------------
        Reporter:  niteria           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.0.3
       Component:  Package system    |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  phab:D2450,
       Wiki Page:                    |  phab:D2514
-------------------------------------+-------------------------------------

Comment (by ezyang):

 > In the short term, would anything go wrong if we allowed an IPID
 anywhere in the stack to satisfy a dependency provided it was unique? And
 if a dependency is not unique, we resolve in the current way, using the DB
 ordering.

 OK, while I was implementing this, I discovered a fairly nasty edge case.
 Consider:

 * db1: p (depends on q)
 * db2: q (depends on r from db3)
 * db3: r
 * db4: r (shadows r from db3)

 A "proper" order to specify these databases is db3 db2 db1 db4, which
 would have the net effect of only bringing r into scope (since everything
 else gets killed with db3's r gets shadowed.) Alternately, db4 db3 db2 db1
 would see just db4 be killed.

 What do you expect to happen if the databases are specified: `db1 db3 db4
 db2`? Under the "non-duplicated package can be specified anywhere" rule,
 `db1` is OK because it refers to `q`, which indeed is only mentioned once.

 OK, now the nastiness begins. Remember that we still need to process
 shadowing in order. So we accept `db1`, process `db3` (fine), and then
 process `db4`, at which point there is a problem. The r from db4 needs to
 shadow the db3 r, and invalidate anything that depends on it. This
 *somehow* has to include db1 and db4, but we haven't even "gotten" to db4
 to process it yet. A giant mess!

 I don't really care about trying hard to salvage the situation, if a user
 comes into it. But what I do care about is giving an easily interpretable
 explanation about whatever behavior we do. But it doesn't seem like there
 is reasonable "non-magical" semantics I can give for this case.

 Here's an alternative: what if we allow you to order your `-package-db`
 flags however you want, but ONLY if there is NO shadowing anywhere in the
 stack? In that case, matters are simple. I am only a little less
 enthusiastic about this because you only need to have one case of
 irrelevant shadowing and boom your command line stops working. Guidance
 requested! What do you care about?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12485#comment:27>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list