Repsect the package name when checking for self-import
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 16 Jan 2015 14:17:14 +0000 (14:17 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 16 Jan 2015 14:17:14 +0000 (14:17 +0000)
Fixes Trac #9997.

In doing this I tripped across the specialness of "this" in
PackageImports.  The magic constant (fsLit "this") is scattered across
the compiler and ought to be put in one place.  But where?

compiler/rename/RnNames.hs
testsuite/tests/module/T9997.hs [new file with mode: 0644]
testsuite/tests/module/all.T

index 5cb7b18..84a56f0 100644 (file)
@@ -186,7 +186,15 @@ rnImportDecl this_mod
     -- at least not until TcIface.tcHiBootIface, which is too late to avoid
     -- typechecker crashes.  ToDo: what about indirect self-import?
     -- But 'import {-# SOURCE #-} M' is ok, even if a bit odd
-    when (not want_boot && imp_mod_name == moduleName this_mod)
+    when (not want_boot &&
+          imp_mod_name == moduleName this_mod &&
+          (case mb_pkg of  -- If we have import "<pkg>" M, then we should
+                           -- check that "<pkg>" is "this" (which is magic)
+                           -- or the name of this_mod's package.  Yurgh!
+                           -- c.f. GHC.findModule, and Trac #9997
+             Nothing     -> True
+             Just pkg_fs -> pkg_fs == fsLit "this" ||
+                            fsToPackageKey pkg_fs == modulePackageKey this_mod))
          (addErr (ptext (sLit "A module cannot import itself:") <+> ppr imp_mod_name))
 
     -- Check for a missing import list (Opt_WarnMissingImportList also
diff --git a/testsuite/tests/module/T9997.hs b/testsuite/tests/module/T9997.hs
new file mode 100644 (file)
index 0000000..acc82da
--- /dev/null
@@ -0,0 +1,5 @@
+{-# LANGUAGE PackageImports #-}
+module Control.DeepSeq where
+
+import "deepseq" Control.DeepSeq
+
index c91d30c..58632be 100644 (file)
@@ -344,3 +344,4 @@ test('T414a', normal, compile, [''])
 test('T414b', normal, compile, [''])
 test('T3776', normal, compile, [''])
 test('T9061', normal, compile, [''])
+test('T9997', normal, compile, [''])