Test earlier for self-import (Trac #9032)
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 23 Dec 2014 15:59:30 +0000 (15:59 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Tue, 23 Dec 2014 16:01:31 +0000 (16:01 +0000)
This patch makes the renamer check for self-import, especially when
dependencies change, because the typechecker can fall over if that
happens.

I'm still uneasy about *indirect* self-import, but I'll leave that for
another day

compiler/rename/RnNames.hs
testsuite/tests/rename/should_fail/Makefile
testsuite/tests/rename/should_fail/T9032.hs [new file with mode: 0644]
testsuite/tests/rename/should_fail/T9032.stderr [new file with mode: 0644]
testsuite/tests/rename/should_fail/all.T

index bff2ed0..145d6fc 100644 (file)
@@ -181,6 +181,14 @@ rnImportDecl this_mod
     let imp_mod_name = unLoc loc_imp_mod_name
         doc = ppr imp_mod_name <+> ptext (sLit "is directly imported")
 
+    -- Check for self-import, which confuses the typechecker (Trac #9032)
+    -- ghc --make rejects self-import cycles already, but batch-mode may not
+    -- 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)
+         (addErr (ptext (sLit "A module cannot import itself:") <+> ppr imp_mod_name))
+
     -- Check for a missing import list (Opt_WarnMissingImportList also
     -- checks for T(..) items but that is done in checkDodgyImport below)
     case imp_details of
@@ -212,9 +220,9 @@ rnImportDecl this_mod
     warnIf (want_boot && any (not.mi_boot) ifaces && isOneShot (ghcMode dflags))
            (warnRedundantSourceImport imp_mod_name)
     when (mod_safe && not (safeImportsOn dflags)) $
-        addErrAt loc (ptext (sLit "safe import can't be used as Safe Haskell isn't on!")
-                  $+$ ptext (sLit $ "please enable Safe Haskell through either "
-                                 ++ "Safe, Trustworthy or Unsafe"))
+        addErr (ptext (sLit "safe import can't be used as Safe Haskell isn't on!")
+                $+$ ptext (sLit $ "please enable Safe Haskell through either "
+                                   ++ "Safe, Trustworthy or Unsafe"))
 
     let
         qual_mod_name = as_mod `orElse` imp_mod_name
index 9101fbd..037694c 100644 (file)
@@ -1,3 +1,8 @@
 TOP=../../..
 include $(TOP)/mk/boilerplate.mk
 include $(TOP)/mk/test.mk
+
+T9032:
+       '$(TEST_HC)' $(TEST_HC_OPTS) -c -fforce-recomp T9032.hs
+       '$(TEST_HC)' $(TEST_HC_OPTS) -c -fforce-recomp -DERR T9032.hs
+
diff --git a/testsuite/tests/rename/should_fail/T9032.hs b/testsuite/tests/rename/should_fail/T9032.hs
new file mode 100644 (file)
index 0000000..0a00ba3
--- /dev/null
@@ -0,0 +1,12 @@
+{-# LANGUAGE CPP #-}
+
+module T9032 where
+
+#ifdef ERR
+import T9032
+#endif
+
+f x = x
+
+
+
diff --git a/testsuite/tests/rename/should_fail/T9032.stderr b/testsuite/tests/rename/should_fail/T9032.stderr
new file mode 100644 (file)
index 0000000..56b9158
--- /dev/null
@@ -0,0 +1,3 @@
+
+T9032.hs:6:1: A module cannot import itself: T9032
+make[2]: *** [T9032] Error 1
index 2798fe9..8d60ef3 100644 (file)
@@ -127,3 +127,8 @@ test('T9436', normal, compile_fail, [''])
 test('T9437', normal, compile_fail, [''])
 test('T9077', normal, compile_fail, [''])
 test('T9815', normal, compile_fail, [''])
+
+test('T9032',
+     exit_code(2),
+     run_command,
+     ['$MAKE -s --no-print-directory T9032'])