Add a warning flag for when the Prelude is implicitly imported (trac #1317)
authorIsaac Dupree <id@isaac.cedarswampstudios.org>
Fri, 11 May 2007 08:45:25 +0000 (08:45 +0000)
committerIsaac Dupree <id@isaac.cedarswampstudios.org>
Fri, 11 May 2007 08:45:25 +0000 (08:45 +0000)
GHC already determines all the implicit (Prelude) imports,
so we just need to check whether there are any of those,
for each module being compiled.

compiler/main/DynFlags.hs
compiler/rename/RnNames.lhs
docs/users_guide/flags.xml
docs/users_guide/using.xml

index e5153ea..51abf36 100644 (file)
@@ -139,6 +139,7 @@ data DynFlag
    | Opt_WarnIsError           -- -Werror; makes warnings fatal
    | Opt_WarnDuplicateExports
    | Opt_WarnHiShadows
+   | Opt_WarnImplicitPrelude
    | Opt_WarnIncompletePatterns
    | Opt_WarnIncompletePatternsRecUpd
    | Opt_WarnMissingFields
@@ -1024,6 +1025,7 @@ dynamic_flags = [
 fFlags = [
   ( "warn-duplicate-exports",          Opt_WarnDuplicateExports ),
   ( "warn-hi-shadowing",               Opt_WarnHiShadows ),
+  ( "warn-implicit-prelude",            Opt_WarnImplicitPrelude ),
   ( "warn-incomplete-patterns",        Opt_WarnIncompletePatterns ),
   ( "warn-incomplete-record-updates",          Opt_WarnIncompletePatternsRecUpd ),
   ( "warn-missing-fields",             Opt_WarnMissingFields ),
index 253d262..4a880ed 100644 (file)
@@ -69,6 +69,10 @@ rnImports imports
              (source, ordinary) = partition is_source_import imports
              is_source_import (L _ (ImportDecl _ is_boot _ _ _)) = is_boot
 
+         ifOptM Opt_WarnImplicitPrelude (
+            when (notNull prel_imports) $ addWarn (implicitPreludeWarn)
+          )
+
          stuff1 <- mapM (rnImportDecl this_mod) (prel_imports ++ ordinary)
          stuff2 <- mapM (rnImportDecl this_mod) source
          let (decls, rdr_env, imp_avails) = combine (stuff1 ++ stuff2)
@@ -1355,4 +1359,7 @@ nullModuleExport mod
 moduleDeprec mod txt
   = sep [ ptext SLIT("Module") <+> quotes (ppr mod) <+> ptext SLIT("is deprecated:"), 
          nest 4 (ppr txt) ]      
+
+implicitPreludeWarn
+  = ptext SLIT("Module `Prelude' implicitly imported")
 \end{code}
index 48cf03a..8e18570 100644 (file)
          </row>
          <row>
            <entry><option>-Wall</option></entry>
-           <entry>enable all warnings</entry>
+           <entry>enable almost all warnings (details in <xref linkend="options-sanity"/>)</entry>
            <entry>dynamic</entry>
            <entry><option>-w</option></entry>
          </row>
            <entry><option>-fno-warn-hi-shadowing</option></entry>
          </row>
 
+          <row>
+            <entry><option>-fwarn-implicit-prelude</option></entry>
+            <entry>warn when the Prelude is implicitly imported</entry>
+            <entry>dynamic</entry>
+            <entry><option>-fno-warn-implicit-prelude</option></entry>
+          </row>
+
          <row>
            <entry><option>-fwarn-incomplete-patterns</option></entry>
            <entry>warn when a pattern match could fail</entry>
index 88c2c9e..544a6e8 100644 (file)
@@ -848,6 +848,7 @@ ghc -c Foo.hs</screen>
             <listitem><option>-fwarn-tabs</option></listitem>
             <listitem><option>-fwarn-incomplete-record-updates</option></listitem>
             <listitem><option>-fwarn-monomorphism-restriction</option></listitem>
+            <listitem><option>-fwarn-implicit-prelude</option></listitem>
           </itemizedlist>
        </listitem>
       </varlistentry>
@@ -914,6 +915,31 @@ ghc -c Foo.hs</screen>
       </varlistentry>
 
       <varlistentry>
+        <term><option>-fwarn-implicit-prelude</option>:</term>
+        <listitem>
+          <indexterm><primary><option>-fwarn-implicit-prelude</option></primary></indexterm>
+          <indexterm><primary>implicit prelude, warning</primary></indexterm>
+          <para>Have the compiler warn if the Prelude is implicitly
+          imported.  This happens unless either the Prelude module is
+          explicitly imported with an <literal>import ... Prelude ...</literal>
+          line, or this implicit import is disabled (either by
+          <option>-fno-implicit-prelude</option> or a
+          <literal>LANGUAGE NoImplicitPrelude</literal> pragma).</para>
+
+          <para>Note that no warning is given for syntax that implicitly
+          refers to the Prelude, even if <option>-fno-implicit-prelude</option>
+          would change whether it refers to the Prelude.
+          For example, no warning is given when
+          <literal>368</literal> means
+          <literal>Prelude.fromInteger (368::Prelude.Integer)</literal>
+          (where <literal>Prelude</literal> refers to the actual Prelude module,
+          regardless of the imports of the module being compiled).</para>
+
+          <para>This warning is off by default.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
        <term><option>-fwarn-incomplete-patterns</option>:</term>
        <listitem>
          <indexterm><primary><option>-fwarn-incomplete-patterns</option></primary></indexterm>