Sync the UG entries for -Wall, -w etc with reality
[ghc-hetmet.git] / docs / users_guide / using.xml
index 88f9e5e..eedc9e1 100644 (file)
@@ -14,7 +14,7 @@
     Options can be specified in three ways:</para>
 
     <sect2>
     Options can be specified in three ways:</para>
 
     <sect2>
-      <title>command-line arguments</title>
+      <title>Command-line arguments</title>
       
       <indexterm><primary>structure, command-line</primary></indexterm>
       <indexterm><primary>command-line</primary><secondary>arguments</secondary></indexterm>
       
       <indexterm><primary>structure, command-line</primary></indexterm>
       <indexterm><primary>command-line</primary><secondary>arguments</secondary></indexterm>
@@ -26,9 +26,9 @@
 ghc [argument...]
 </screen>
 
 ghc [argument...]
 </screen>
 
-      <para>command-line arguments are either options or file names.</para>
+      <para>Command-line arguments are either options or file names.</para>
 
 
-      <para>command-line options begin with <literal>-</literal>.
+      <para>Command-line options begin with <literal>-</literal>.
       They may <emphasis>not</emphasis> be grouped:
       <option>-vO</option> is different from <option>-v -O</option>.
       Options need not precede filenames: e.g., <literal>ghc *.o -o
       They may <emphasis>not</emphasis> be grouped:
       <option>-vO</option> is different from <option>-v -O</option>.
       Options need not precede filenames: e.g., <literal>ghc *.o -o
@@ -40,7 +40,7 @@ ghc [argument...]
     </sect2>
 
     <sect2 id="source-file-options">
     </sect2>
 
     <sect2 id="source-file-options">
-      <title>command line options in source files</title>
+      <title>Command line options in source files</title>
     
       <indexterm><primary>source-file options</primary></indexterm>
 
     
       <indexterm><primary>source-file options</primary></indexterm>
 
@@ -81,7 +81,7 @@ module X where
       <para>It is not recommended to move all the contents of your
       Makefiles into your source files, but in some circumstances, the
       <literal>OPTIONS_GHC</literal> pragma is the Right Thing. (If you
       <para>It is not recommended to move all the contents of your
       Makefiles into your source files, but in some circumstances, the
       <literal>OPTIONS_GHC</literal> pragma is the Right Thing. (If you
-      use <option>-keep-hc-file-too</option> and have OPTION flags in
+      use <option>-keep-hc-file</option> and have OPTION flags in
       your module, the OPTIONS_GHC will get put into the generated .hc
       file).</para>
     </sect2>
       your module, the OPTIONS_GHC will get put into the generated .hc
       file).</para>
     </sect2>
@@ -104,8 +104,8 @@ module X where
     <indexterm><primary>mode</primary><secondary>options</secondary>
     </indexterm>
 
     <indexterm><primary>mode</primary><secondary>options</secondary>
     </indexterm>
 
-    <para>Each of GHC's command line options is classified as either
-    <firstterm>static</firstterm> or <firstterm>dynamic</firstterm> or
+    <para>Each of GHC's command line options is classified as
+    <firstterm>static</firstterm>, <firstterm>dynamic</firstterm> or
       <firstterm>mode</firstterm>:</para>
 
     <variablelist>
       <firstterm>mode</firstterm>:</para>
 
     <variablelist>
@@ -113,7 +113,7 @@ module X where
        <term>Mode flags</term>
        <listitem>
          <para>For example, <option>--make</option> or <option>-E</option>.
        <term>Mode flags</term>
        <listitem>
          <para>For example, <option>--make</option> or <option>-E</option>.
-           There may be only a single mode flag on the command line.  The
+           There may only be a single mode flag on the command line.  The
            available modes are listed in <xref linkend="modes"/>.</para>
        </listitem>
       </varlistentry>
            available modes are listed in <xref linkend="modes"/>.</para>
        </listitem>
       </varlistentry>
@@ -379,9 +379,9 @@ module X where
          interfaces, and include files (usually something like
          <literal>/usr/local/lib/ghc-5.04</literal> on Unix).  This
          is the value of
          interfaces, and include files (usually something like
          <literal>/usr/local/lib/ghc-5.04</literal> on Unix).  This
          is the value of
-         <literal>$libdir</literal><indexterm><primary><literal>libdir</literal></primary>
-         </indexterm>in the package configuration file (see <xref
-         linkend="packages"/>).</para>
+         <literal>$libdir</literal><indexterm><primary><literal>libdir</literal></primary></indexterm>
+      in the package configuration file
+      (see <xref linkend="packages"/>).</para>
        </listitem>
       </varlistentry>
 
        </listitem>
       </varlistentry>
 
@@ -394,7 +394,7 @@ module X where
       
       <para>When given the <option>&ndash;&ndash;make</option> option,
       GHC will build a multi-module Haskell program by following
       
       <para>When given the <option>&ndash;&ndash;make</option> option,
       GHC will build a multi-module Haskell program by following
-      dependencies from a single root module (usually
+      dependencies from one or more root modules (usually just
       <literal>Main</literal>).  For example, if your
       <literal>Main</literal> module is in a file called
       <filename>Main.hs</filename>, you could compile and link the
       <literal>Main</literal>).  For example, if your
       <literal>Main</literal> module is in a file called
       <filename>Main.hs</filename>, you could compile and link the
@@ -408,7 +408,7 @@ ghc &ndash;&ndash;make Main.hs
       names or module names; GHC will figure out all the modules in
       the program by following the imports from these initial modules.
       It will then attempt to compile each module which is out of
       names or module names; GHC will figure out all the modules in
       the program by following the imports from these initial modules.
       It will then attempt to compile each module which is out of
-      date, and finally if there is a <literal>Main</literal> module,
+      date, and finally, if there is a <literal>Main</literal> module,
       the program will also be linked into an executable.</para>
 
       <para>The main advantages to using <literal>ghc
       the program will also be linked into an executable.</para>
 
       <para>The main advantages to using <literal>ghc
@@ -503,7 +503,7 @@ olleh
       
       <para>The first phase to run is determined by each input-file
       suffix, and the last phase is determined by a flag.  If no
       
       <para>The first phase to run is determined by each input-file
       suffix, and the last phase is determined by a flag.  If no
-      relevant flag is present, then go all the way through linking.
+      relevant flag is present, then go all the way through to linking.
       This table summarises:</para>
       
       <informaltable>
       This table summarises:</para>
       
       <informaltable>
@@ -595,9 +595,7 @@ ghc -c Foo.hs</screen>
       
       <para>Note: The option <option>-E</option><indexterm><primary>-E
       option</primary></indexterm> runs just the pre-processing passes
       
       <para>Note: The option <option>-E</option><indexterm><primary>-E
       option</primary></indexterm> runs just the pre-processing passes
-      of the compiler, dumping the result in a file.  Note that this
-      differs from the previous behaviour of dumping the file to
-      standard output.</para>
+      of the compiler, dumping the result in a file.</para>
 
       <sect3 id="overriding-suffixes">
        <title>Overriding the default behaviour for a file</title>
 
       <sect3 id="overriding-suffixes">
        <title>Overriding the default behaviour for a file</title>
@@ -821,6 +819,7 @@ ghc -c Foo.hs</screen>
          <indexterm><primary>-W option</primary></indexterm>
          <para>Provides the standard warnings plus
          <option>-fwarn-incomplete-patterns</option>,
          <indexterm><primary>-W option</primary></indexterm>
          <para>Provides the standard warnings plus
          <option>-fwarn-incomplete-patterns</option>,
+         <option>-fwarn-dodgy-imports</option>,
          <option>-fwarn-unused-matches</option>,
          <option>-fwarn-unused-imports</option>, and
          <option>-fwarn-unused-binds</option>.</para>
          <option>-fwarn-unused-matches</option>,
          <option>-fwarn-unused-imports</option>, and
          <option>-fwarn-unused-binds</option>.</para>
@@ -828,18 +827,27 @@ ghc -c Foo.hs</screen>
       </varlistentry>
 
       <varlistentry>
       </varlistentry>
 
       <varlistentry>
-       <term><option>-w</option>:</term>
+       <term><option>-Wall</option>:</term>
        <listitem>
        <listitem>
-         <indexterm><primary><option>-w</option></primary></indexterm>
-         <para>Turns off all warnings, including the standard ones.</para>
+         <indexterm><primary><option>-Wall</option></primary></indexterm>
+         <para>Turns on all warning options that indicate potentially
+         suspicious code.  The warnings that are
+         <emphasis>not</emphasis> enabled by <option>-Wall</option>
+         are
+            <option>-fwarn-simple-patterns</option>,
+            <option>-fwarn-tabs</option>,
+            <option>-fwarn-incomplete-record-updates</option>,
+            <option>-fwarn-monomorphism-restriction</option>, and
+            <option>-fwarn-implicit-prelude</option>.</para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term><option>-Wall</option>:</term>
+       <term><option>-w</option>:</term>
        <listitem>
        <listitem>
-         <indexterm><primary><option>-Wall</option></primary></indexterm>
-         <para>Turns on all warning options.</para>
+         <indexterm><primary><option>-w</option></primary></indexterm>
+         <para>Turns off all warnings, including the standard ones and
+      those that <literal>-Wall</literal> doesn't enable.</para>
        </listitem>
       </varlistentry>
 
        </listitem>
       </varlistentry>
 
@@ -905,6 +913,31 @@ ghc -c Foo.hs</screen>
       </varlistentry>
 
       <varlistentry>
       </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>
        <term><option>-fwarn-incomplete-patterns</option>:</term>
        <listitem>
          <indexterm><primary><option>-fwarn-incomplete-patterns</option></primary></indexterm>
@@ -1025,7 +1058,7 @@ f foo = foo { x = 6 }
           in the inadvertent cyclic definition <literal>let x = ... x
           ... in</literal>.</para>
 
           in the inadvertent cyclic definition <literal>let x = ... x
           ... in</literal>.</para>
 
-         <para>Consequently, this option does
+         <para>Consequently, this option
           <emphasis>will</emphasis> complain about cyclic recursive
           definitions.</para>
        </listitem>
           <emphasis>will</emphasis> complain about cyclic recursive
           definitions.</para>
        </listitem>
@@ -1145,7 +1178,7 @@ f "2"    = 2
          the MR can give rise to unexpected behaviour, so it can be helpful
          to have an explicit warning that it is being applied.</para>
 
          the MR can give rise to unexpected behaviour, so it can be helpful
          to have an explicit warning that it is being applied.</para>
 
-         <para>This warning is on by default.</para>
+         <para>This warning is off by default.</para>
        </listitem>
       </varlistentry>
 
        </listitem>
       </varlistentry>
 
@@ -1241,7 +1274,7 @@ f "2"    = 2
       <para>Note that higher optimisation levels cause more
       cross-module optimisation to be performed, which can have an
       impact on how much of your program needs to be recompiled when
       <para>Note that higher optimisation levels cause more
       cross-module optimisation to be performed, which can have an
       impact on how much of your program needs to be recompiled when
-      you change something.  This is one reaosn to stick to
+      you change something.  This is one reason to stick to
       no-optimisation when developing code.</para>
 
       <variablelist>
       no-optimisation when developing code.</para>
 
       <variablelist>
@@ -1450,6 +1483,50 @@ f "2"    = 2
 
        <varlistentry>
          <term>
 
        <varlistentry>
          <term>
+            <option>-fno-state-hack</option>
+            <indexterm><primary><option>-fno-state-hack</option></primary></indexterm>
+          </term>
+         <listitem>
+           <para>Turn off the "state hack" whereby any lambda with a
+             <literal>State#</literal> token as argument is considered to be
+             single-entry, hence it is considered OK to inline things inside
+             it.  This can improve performance of IO and ST monad code, but it
+           runs the risk of reducing sharing.</para> 
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term>
+            <option>-fomit-interface-pragmas</option>
+           <indexterm><primary><option>-fomit-interface-pragmas</option></primary></indexterm>
+          </term>
+         <listitem>
+           <para>Tells GHC to omit all inessential information from the interface file
+             generated for the module being compiled (say M).  This means that a module
+             importing M will see only the <emphasis>types</emphasis> of the functions that M exports, but not
+             their unfoldings, strictness info, etc.  Hence, for example,
+             no function exported by M will be inlined
+             into an importing module.  The benefit is that modules that import M will
+             need to be recompiled less often (only when M's exports change their type,
+             not when they change their implementation).
+             </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term>
+            <option>-fignore-interface-pragmas</option>
+           <indexterm><primary><option>-fignore-interface-pragmas</option></primary></indexterm>
+          </term>
+         <listitem>
+           <para>Tells GHC to ignore all inessential information when reading interface files.
+           That is, even if <filename>M.hi</filename> contains unfolding or strictness information
+           for a function, GHC will ignore that information.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term>
             <option>-funbox-strict-fields</option>:
            <indexterm><primary><option>-funbox-strict-fields</option></primary></indexterm>
            <indexterm><primary>strict constructor fields</primary></indexterm>
             <option>-funbox-strict-fields</option>:
            <indexterm><primary><option>-funbox-strict-fields</option></primary></indexterm>
            <indexterm><primary>strict constructor fields</primary></indexterm>
@@ -1472,7 +1549,7 @@ f "2"    = 2
 
        <varlistentry>
          <term>
 
        <varlistentry>
          <term>
-            <option>-funfolding-update-in-place&lt;n&gt;</option>
+            <option>-funfolding-update-in-place=<replaceable>n</replaceable></option>
             <indexterm><primary><option>-funfolding-update-in-place</option></primary></indexterm>
           </term>
          <listitem>
             <indexterm><primary><option>-funfolding-update-in-place</option></primary></indexterm>
           </term>
          <listitem>
@@ -1490,7 +1567,7 @@ f "2"    = 2
 
        <varlistentry>
          <term>
 
        <varlistentry>
          <term>
-            <option>-funfolding-creation-threshold&lt;n&gt;</option>:
+            <option>-funfolding-creation-threshold=<replaceable>n</replaceable></option>:
            <indexterm><primary><option>-funfolding-creation-threshold</option></primary></indexterm>
            <indexterm><primary>inlining, controlling</primary></indexterm>
            <indexterm><primary>unfolding, controlling</primary></indexterm>
            <indexterm><primary><option>-funfolding-creation-threshold</option></primary></indexterm>
            <indexterm><primary>inlining, controlling</primary></indexterm>
            <indexterm><primary>unfolding, controlling</primary></indexterm>
@@ -1516,7 +1593,7 @@ f "2"    = 2
        </varlistentry>
 
        <varlistentry>
        </varlistentry>
 
        <varlistentry>
-         <term><option>-funfolding-use-threshold&lt;n&gt;</option>:</term>
+         <term><option>-funfolding-use-threshold=<replaceable>n</replaceable></option></term>
          <listitem>
            <indexterm><primary><option>-funfolding-use-threshold</option></primary></indexterm>
            <indexterm><primary>inlining, controlling</primary></indexterm>
          <listitem>
            <indexterm><primary><option>-funfolding-use-threshold</option></primary></indexterm>
            <indexterm><primary>inlining, controlling</primary></indexterm>