[commit: ghc] ghc-8.2: Add a Note describing #14128 (6cf6a69)

git at git.haskell.org git at git.haskell.org
Tue Sep 19 21:10:28 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : ghc-8.2
Link       : http://ghc.haskell.org/trac/ghc/changeset/6cf6a69ccea46577b956797395466e09fb1614f2/ghc

>---------------------------------------------------------------

commit 6cf6a69ccea46577b956797395466e09fb1614f2
Author: Ben Gamari <ben at smart-cactus.org>
Date:   Tue Aug 29 19:14:22 2017 -0400

    Add a Note describing #14128
    
    I prematurely committed the D3892 before adding a Note. Fix this.
    
    (cherry picked from commit 6f1ccaa50f905bdc586a7a92ab7e38e30c1e7ff5)


>---------------------------------------------------------------

6cf6a69ccea46577b956797395466e09fb1614f2
 compiler/deSugar/DsUsage.hs | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/compiler/deSugar/DsUsage.hs b/compiler/deSugar/DsUsage.hs
index 3f302fa..6219804 100644
--- a/compiler/deSugar/DsUsage.hs
+++ b/compiler/deSugar/DsUsage.hs
@@ -26,6 +26,25 @@ import Data.Map (Map)
 import qualified Data.Map as Map
 import qualified Data.Set as Set
 
+{- Note [Module self-dependency]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+RnNames.calculateAvails asserts the invariant that a module must not occur in
+its own dep_orphs or dep_finsts. However, if we aren't careful this can occur
+in the presence of hs-boot files: Consider that we have two modules, A and B,
+both with hs-boot files,
+
+    A.hs contains a SOURCE import of B B.hs-boot contains a SOURCE import of A
+    A.hs-boot declares an orphan instance A.hs defines the orphan instance
+
+In this case, B's dep_orphs will contain A due to its SOURCE import of A.
+Consequently, A will contain itself in its imp_orphs due to its import of B.
+This fact would end up being recorded in A's interface file. This would then
+break the invariant asserted by calculateAvails that a module does not itself in
+its dep_orphs. This was the cause of Trac #14128.
+
+-}
+
 -- | Extract information from the rename and typecheck phases to produce
 -- a dependencies information for the module being compiled.
 mkDependencies :: TcGblEnv -> IO Dependencies
@@ -48,7 +67,7 @@ mkDependencies
 
           dep_orphs = filter (/= mod) (imp_orphs imports)
                 -- We must also remove self-references from imp_orphs. See
-                -- #14128.
+                -- Note [Module self-dependency]
 
           pkgs | th_used   = Set.insert (toInstalledUnitId thUnitId) (imp_dep_pkgs imports)
                | otherwise = imp_dep_pkgs imports



More information about the ghc-commits mailing list