]> git.sur5r.net Git - cc65/commitdiff
Rewrote handling of the -W command line option. It is now used to enable or
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 8 Oct 2009 13:29:35 +0000 (13:29 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 8 Oct 2009 13:29:35 +0000 (13:29 +0000)
disable warnings by name.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4348 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/cc65.sgml
src/cc65/error.c
src/cc65/error.h
src/cc65/global.c
src/cc65/global.h
src/cc65/main.c
src/cc65/pragma.c
src/cc65/symtab.c

index 443f12798b87b145ee15028c074b27e00876e271..a1daf3deaf6f9bbe02128300196e9523c189b4d5 100644 (file)
@@ -64,7 +64,7 @@ Short options:
   -Os                   Inline some known functions
   -T                    Include source as comment
   -V                    Print the compiler version number
-  -W                    Suppress warnings
+  -W name[,name]        Enable or disable warnings
   -d                    Debug mode
   -g                    Add debug info to object file
   -h                    Help (this text)
@@ -118,7 +118,7 @@ Here is a description of all the command line options:
   Tells the compiler to generate code that checks for stack overflows. See
   <tt><ref id="pragma-checkstack" name="#pragma&nbsp;checkstack"></tt> for an
   explanation of this feature.
-
+                                
 
   <tag><tt>--code-name seg</tt></tag>
 
@@ -383,11 +383,27 @@ Here is a description of all the command line options:
 
 
   <label id="option-W">
-  <tag><tt>-W</tt></tag>
-
-  This option will suppress any warnings generated by the compiler. Since
-  any source file may be written in a manner that it will not produce
-  compiler warnings, using this option is usually not a good idea.
+  <tag><tt>-W name[,name]</tt></tag>
+
+  This option allows to control warnings generated by the compiler. It is
+  followed by a comma separated list of warnings that should be enabled or
+  disabled. To disable a warning, its name is prefixed by a minus sign. If
+  no such prefix exists, or the name is prefixed by a plus sign, the warning
+  is enabled.
+
+  The following warning names are currently recognized:
+  <descrip>
+  <tag><tt/error/</tag>
+        Treat all warnings as errors.
+  <tag><tt/unknown-pragma/</tag>
+        Warn about known #pragmas.
+  <tag><tt/unused-label/</tag>
+        Warn about unused labels.
+  <tag><tt/unused-param/</tag>
+        Warn about unused function parameters.
+  <tag><tt/unused-var/</tag>
+        Warn about unused variables.
+  </descrip>
 
 </descrip><p>
 
@@ -398,7 +414,7 @@ The compiler will accept one C file per invocation and create a file with
 the same base name, but with the extension replaced by ".s". The output
 file contains assembler code suitable for the use with the ca65 macro
 assembler.
-                                               
+
 Include files in single quotes are searched in the following places:
 <enum>
 <item>The current directory.
@@ -411,7 +427,7 @@ Include files in angle brackets are searched in the following places:
 <item>A compiled in directory which is often <tt>/usr/lib/cc65/include</tt> on
       Linux systems.
 <item>The value of the environment variable <tt/CC65_INC/ if it is defined.
-<item>A subdirectory named <tt/include/ of the directory defined in the 
+<item>A subdirectory named <tt/include/ of the directory defined in the
       environment variable <tt/CC65_HOME/, if it is defined.
 <item>Any directory added with the <tt/-I/ option on the command line.
 </enum>
index 694ccdd01deaed5bcadf088821e475019a56c121..95549216bcf5a8d416a31c8b5b582701222d5680 100644 (file)
 unsigned ErrorCount    = 0;
 unsigned WarningCount  = 0;
 
+/* Warning and error options */
+IntStack WarnEnable         = INTSTACK(1);  /* Enable warnings */
+IntStack WarningsAreErrors  = INTSTACK(0);  /* Treat warnings as errors */
+IntStack WarnUnusedLabel    = INTSTACK(1);  /* Warn about unused labels */
+IntStack WarnUnusedParam    = INTSTACK(1);  /* Warn about unused parameters */
+IntStack WarnUnusedVar      = INTSTACK(1);  /* Warn about unused variables */
+IntStack WarnUnknownPragma  = INTSTACK(1);  /* Warn about unknown #pragmas */
+
+/* Map the name of a warning to the intstack that holds its state */
+typedef struct WarnMapEntry WarnMapEntry;
+struct WarnMapEntry {
+    IntStack*   Stack;
+    const char* Name;
+};
+static WarnMapEntry WarnMap[] = {
+    /* Keep sorted, even if this isn't used for now */
+    { &WarningsAreErrors,       "error"                 },
+    { &WarnUnknownPragma,       "unknown-pragma"        },
+    { &WarnUnusedLabel,         "unused-label"          },
+    { &WarnUnusedParam,         "unused-param"          },
+    { &WarnUnusedVar,           "unused-var"            },
+};
+
 
 
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                         Handling of fatal errors                          */
 /*****************************************************************************/
 
 
 
-static void IntWarning (const char* Filename, unsigned LineNo, const char* Msg, va_list ap)
-/* Print warning message - internal function. */
+void Fatal (const char* Format, ...)
+/* Print a message about a fatal error and die */
 {
-    if (!IS_Get (&WarnDisable)) {
-               fprintf (stderr, "%s(%u): Warning: ", Filename, LineNo);
-       vfprintf (stderr, Msg, ap);
-       fprintf (stderr, "\n");
+    va_list ap;
 
-        if (Line) {
-           Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
-        }
-       ++WarningCount;
+    const char* FileName;
+    unsigned    LineNum;
+    if (CurTok.LI) {
+       FileName = GetInputName (CurTok.LI);
+       LineNum  = GetInputLine (CurTok.LI);
+    } else {
+       FileName = GetCurrentFile ();
+       LineNum  = GetCurrentLine ();
     }
-}
-
 
+    fprintf (stderr, "%s(%u): Fatal: ", FileName, LineNum);
 
-void Warning (const char* Format, ...)
-/* Print warning message. */
-{
-    va_list ap;
     va_start (ap, Format);
-    IntWarning (GetInputName (CurTok.LI), GetInputLine (CurTok.LI), Format, ap);
+    vfprintf (stderr, Format, ap);
     va_end (ap);
+    fprintf (stderr, "\n");
+
+    if (Line) {
+        Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
+    }
+    exit (EXIT_FAILURE);
 }
 
 
 
-void LIWarning (const LineInfo* LI, const char* Format, ...)
-/* Print a warning message with the line info given explicitly */
+void Internal (const char* Format, ...)
+/* Print a message about an internal compiler error and die. */
 {
     va_list ap;
-    va_start (ap, Format);
-    IntWarning (GetInputName (LI), GetInputLine (LI), Format, ap);
-    va_end (ap);
-}
 
+    const char* FileName;
+    unsigned    LineNum;
+    if (CurTok.LI) {
+       FileName = GetInputName (CurTok.LI);
+       LineNum  = GetInputLine (CurTok.LI);
+    } else {
+       FileName = GetCurrentFile ();
+       LineNum  = GetCurrentLine ();
+    }
 
+    fprintf (stderr, "%s(%u): Internal compiler error:\n",
+            FileName, LineNum);
 
-void PPWarning (const char* Format, ...)
-/* Print warning message. For use within the preprocessor. */
-{
-    va_list ap;
     va_start (ap, Format);
-    IntWarning (GetCurrentFile(), GetCurrentLine(), Format, ap);
+    vfprintf (stderr, Format, ap);
     va_end (ap);
+    fprintf (stderr, "\n");
+
+    if (Line) {
+        fprintf (stderr, "\nInput: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
+    }
+
+    /* Use abort to create a core dump */
+    abort ();
 }
 
 
 
+/*****************************************************************************/
+/*                            Handling of errors                             */
+/*****************************************************************************/
+
+
+
 static void IntError (const char* Filename, unsigned LineNo, const char* Msg, va_list ap)
 /* Print an error message - internal function*/
 {
@@ -169,69 +211,93 @@ void PPError (const char* Format, ...)
 
 
 
-void Fatal (const char* Format, ...)
-/* Print a message about a fatal error and die */
+/*****************************************************************************/
+/*                           Handling of warnings                            */
+/*****************************************************************************/
+
+
+
+static void IntWarning (const char* Filename, unsigned LineNo, const char* Msg, va_list ap)
+/* Print warning message - internal function. */
 {
-    va_list ap;
+    if (IS_Get (&WarningsAreErrors)) {
+
+        /* Treat the warning as an error */
+        IntError (Filename, LineNo, Msg, ap);
+
+    } else if (IS_Get (&WarnEnable)) {
+
+               fprintf (stderr, "%s(%u): Warning: ", Filename, LineNo);
+       vfprintf (stderr, Msg, ap);
+       fprintf (stderr, "\n");
+
+        if (Line) {
+           Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
+        }
+       ++WarningCount;
 
-    const char* FileName;
-    unsigned    LineNum;
-    if (CurTok.LI) {
-       FileName = GetInputName (CurTok.LI);
-       LineNum  = GetInputLine (CurTok.LI);
-    } else {
-       FileName = GetCurrentFile ();
-       LineNum  = GetCurrentLine ();
     }
+}
 
-    fprintf (stderr, "%s(%u): Fatal: ", FileName, LineNum);
 
+
+void Warning (const char* Format, ...)
+/* Print warning message. */
+{
+    va_list ap;
     va_start (ap, Format);
-    vfprintf (stderr, Format, ap);
+    IntWarning (GetInputName (CurTok.LI), GetInputLine (CurTok.LI), Format, ap);
     va_end (ap);
-    fprintf (stderr, "\n");
-
-    if (Line) {
-        Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
-    }
-    exit (EXIT_FAILURE);
 }
 
 
 
-void Internal (const char* Format, ...)
-/* Print a message about an internal compiler error and die. */
+void LIWarning (const LineInfo* LI, const char* Format, ...)
+/* Print a warning message with the line info given explicitly */
 {
     va_list ap;
+    va_start (ap, Format);
+    IntWarning (GetInputName (LI), GetInputLine (LI), Format, ap);
+    va_end (ap);
+}
 
-    const char* FileName;
-    unsigned    LineNum;
-    if (CurTok.LI) {
-       FileName = GetInputName (CurTok.LI);
-       LineNum  = GetInputLine (CurTok.LI);
-    } else {
-       FileName = GetCurrentFile ();
-       LineNum  = GetCurrentLine ();
-    }
 
-    fprintf (stderr, "%s(%u): Internal compiler error:\n",
-            FileName, LineNum);
 
+void PPWarning (const char* Format, ...)
+/* Print warning message. For use within the preprocessor. */
+{
+    va_list ap;
     va_start (ap, Format);
-    vfprintf (stderr, Format, ap);
+    IntWarning (GetCurrentFile(), GetCurrentLine(), Format, ap);
     va_end (ap);
-    fprintf (stderr, "\n");
+}
 
-    if (Line) {
-        fprintf (stderr, "\nInput: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line));
-    }
 
-    /* Use abort to create a core dump */
-    abort ();
+
+IntStack* FindWarning (const char* Name)
+/* Search for a warning in the WarnMap table and return a pointer to the
+ * intstack that holds its state. Return NULL if there is no such warning.
+ */
+{
+    unsigned I;
+
+    /* For now, do a linear search */
+    for (I = 0; I < sizeof(WarnMap) / sizeof (WarnMap[0]); ++I) {
+        if (strcmp (WarnMap[I].Name, Name) == 0) {
+            return WarnMap[I].Stack;
+        }
+    }
+    return 0;
 }
 
 
 
+/*****************************************************************************/
+/*                                   Code                                    */
+/*****************************************************************************/
+
+
+
 void ErrorReport (void)
 /* Report errors (called at end of compile) */
 {
index 37b60afa560f7352503a5a76af99446c160f1a0b..d51b9093b0c15fca28cb75aeefa1d42ff09878e3 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 1998-2009, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -40,6 +40,7 @@
 
 /* common */
 #include "attrib.h"
+#include "intstack.h"
 
 /* cc65 */
 #include "lineinfo.h"
 extern unsigned ErrorCount;
 extern unsigned WarningCount;
 
+/* Warning and error options */
+extern IntStack WarnEnable;             /* Enable warnings */
+extern IntStack WarningsAreErrors;      /* Treat warnings as errors */
+extern IntStack WarnUnusedLabel;        /* Warn about unused labels */
+extern IntStack WarnUnusedParam;        /* Warn about unused parameters */
+extern IntStack WarnUnusedVar;          /* Warn about unused variables */
+extern IntStack WarnUnknownPragma;      /* Warn about unknown #pragmas */
+
 
 
 /*****************************************************************************/
@@ -64,14 +73,11 @@ extern unsigned WarningCount;
 
 
 
-void Warning (const char* Format, ...) attribute ((format (printf, 1, 2)));
-/* Print warning message. */
-
-void LIWarning (const LineInfo* LI, const char* Format, ...) attribute ((format (printf, 2, 3)));
-/* Print a warning message with the line info given explicitly */
+void Fatal (const char* Format, ...) attribute ((noreturn, format (printf, 1, 2)));
+/* Print a message about a fatal error and die */
 
-void PPWarning (const char* Format, ...) attribute ((format (printf, 1, 2)));
-/* Print warning message. For use within the preprocessor. */
+void Internal (const char* Format, ...) attribute ((noreturn, format (printf, 1, 2)));
+/* Print a message about an internal compiler error and die. */
 
 void Error (const char* Format, ...) attribute ((format (printf, 1, 2)));
 /* Print an error message */
@@ -82,11 +88,19 @@ void LIError (const LineInfo* LI, const char* Format, ...) attribute ((format (p
 void PPError (const char* Format, ...) attribute ((format (printf, 1, 2)));
 /* Print an error message. For use within the preprocessor.  */
 
-void Fatal (const char* Format, ...) attribute ((noreturn, format (printf, 1, 2)));
-/* Print a message about a fatal error and die */
+void Warning (const char* Format, ...) attribute ((format (printf, 1, 2)));
+/* Print warning message. */
 
-void Internal (const char* Format, ...) attribute ((noreturn, format (printf, 1, 2)));
-/* Print a message about an internal compiler error and die. */
+void LIWarning (const LineInfo* LI, const char* Format, ...) attribute ((format (printf, 2, 3)));
+/* Print a warning message with the line info given explicitly */
+
+void PPWarning (const char* Format, ...) attribute ((format (printf, 1, 2)));
+/* Print warning message. For use within the preprocessor. */
+
+IntStack* FindWarning (const char* Name);
+/* Search for a warning in the WarnMap table and return a pointer to the
+ * intstack that holds its state. Return NULL if there is no such warning.
+ */
 
 void ErrorReport (void);
 /* Report errors (called at end of compile) */
index 1a9d01aab22e020b63bdbf5e4d7c3db98e8cc373..28fb2355726a2ce4a095750878a14d4e15ebdf61 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2004 Ullrich von Bassewitz                                       */
-/*               Römerstraße 52                                              */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2009, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -50,7 +50,6 @@ unsigned char PreprocessOnly    = 0;    /* Just preprocess the input */
 unsigned      RegisterSpace     = 6;    /* Space available for register vars */
 
 /* Stackable options */
-IntStack WarnDisable        = INTSTACK(0);  /* Suppress warnings */
 IntStack WritableStrings    = INTSTACK(0);  /* Literal strings are r/w */
 IntStack InlineStdFuncs     = INTSTACK(0);  /* Inline some known functions */
 IntStack EnableRegVars      = INTSTACK(0);  /* Enable register variables */
index d7820c715312ba0aa4dbba48c8fc6008245caca7..6b533be261e9467fe99476a94a2b159116b62120 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2004 Ullrich von Bassewitz                                       */
-/*               Römerstraße 52                                              */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2009, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -57,7 +57,6 @@ extern unsigned char    PreprocessOnly;         /* Just preprocess the input */
 extern unsigned         RegisterSpace;          /* Space available for register vars */
 
 /* Stackable options */
-extern IntStack         WarnDisable;            /* Suppress warnings */
 extern IntStack         WritableStrings;       /* Literal strings are r/w */
 extern IntStack         InlineStdFuncs;                /* Inline some known functions */
 extern IntStack         EnableRegVars;         /* Enable register variables */
index 83109181a92b73ab481f7e774e9e3c443148e2a9..3785716dfafc1bdaa7e543757df16ec88f24cbfd 100644 (file)
@@ -48,6 +48,7 @@
 #include "mmodel.h"
 #include "print.h"
 #include "segnames.h"
+#include "strbuf.h"
 #include "target.h"
 #include "tgttrans.h"
 #include "version.h"
@@ -373,7 +374,7 @@ static void OptCodeSize (const char* Opt, const char* Arg)
     /* Numeric argument expected */
     if (sscanf (Arg, "%u%c", &Factor, &BoundsCheck) != 1 ||
         Factor < 10 || Factor > 1000) {
-        InvArg (Opt, Arg);
+       AbEnd ("Argument for %s is invalid", Opt);
     }
     IS_Set (&CodeSizeFactor, Factor);
 }
@@ -396,7 +397,7 @@ static void OptCPU (const char* Opt, const char* Arg)
     CPU = FindCPU (Arg);
     if (CPU != CPU_6502 && CPU != CPU_6502X && CPU != CPU_65SC02 &&
         CPU != CPU_65C02 && CPU != CPU_65816 && CPU != CPU_HUC6280) {
-        InvArg (Opt, Arg);
+               AbEnd ("Invalid argument for %s: `%s'", Opt, Arg);
     }
 }
 
@@ -584,7 +585,7 @@ static void OptRegisterSpace (const char* Opt, const char* Arg)
 {
     /* Numeric argument expected */
     if (sscanf (Arg, "%u", &RegisterSpace) != 1 || RegisterSpace > 256) {
-        InvArg (Opt, Arg);
+               AbEnd ("Argument for option %s is invalid", Opt);
     }
 }
 
@@ -626,7 +627,7 @@ static void OptStandard (const char* Opt, const char* Arg)
     /* Find the standard from the given name */
     standard_t Std = FindStandard (Arg);
     if (Std == STD_UNKNOWN) {
-        InvArg (Opt, Arg);
+               AbEnd ("Invalid argument for %s: `%s'", Opt, Arg);
     } else if (IS_Get (&Standard) != STD_UNKNOWN) {
         AbEnd ("Option %s given more than once", Opt);
     } else {
@@ -674,6 +675,52 @@ static void OptVersion (const char* Opt attribute ((unused)),
 
 
 
+static void OptWarning (const char* Opt attribute ((unused)), const char* Arg)
+/* Handle the -W option */
+{
+    StrBuf W = AUTO_STRBUF_INITIALIZER;
+
+    /* Arg is a list of suboptions, separated by commas */
+    while (Arg) {
+
+        const char* Pos;
+        int         Enabled = 1;
+        IntStack*   S;
+
+        /* The suboption may be prefixed with '-' or '+' */
+        if (*Arg == '-') {
+            Enabled = 0;
+            ++Arg;
+        } else if (*Arg == '+') {
+            /* This is the default */
+            ++Arg;
+        }
+
+        /* Get the next suboption */
+        Pos = strchr (Arg, ',');
+        if (Pos) {
+            SB_CopyBuf (&W, Arg, Pos - Arg);
+            Arg = Pos + 1;
+        } else {
+            SB_CopyStr (&W, Arg);
+            Arg = 0;
+        }
+        SB_Terminate (&W);
+
+        /* Search for the warning */
+        S = FindWarning (SB_GetConstBuf (&W));
+        if (S == 0) {
+            InvArg (Opt, SB_GetConstBuf (&W));
+        }
+        IS_Set (S, Enabled);
+    }
+
+    /* Free allocated memory */
+    SB_Done (&W);
+}
+
+
+
 static void OptWritableStrings (const char* Opt attribute ((unused)),
                                const char* Arg attribute ((unused)))
 /* Make string literals writable */
@@ -741,9 +788,9 @@ int main (int argc, char* argv[])
                const char* Arg = ArgVec[I];
 
                /* Check for an option */
-               if (Arg [0] == '-') {
+               if (Arg[0] == '-') {
 
-                   switch (Arg [1]) {
+                   switch (Arg[1]) {
 
                case '-':
                    LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0]));
@@ -796,7 +843,7 @@ int main (int argc, char* argv[])
                            default:
                                UnknownOption (Arg);
                                break;
-                       }
+                       }
                    }
                    break;
 
@@ -839,7 +886,7 @@ int main (int argc, char* argv[])
                            break;
 
                        case 'W':
-                           IS_Set (&WarnDisable, 1);
+                    OptWarning (Arg, GetArg (&I, 2));
                            break;
 
                        default:
index cfcac04ea04a8f72eaeecf43f79978ea470165bd..108f866142e7d1643f23335a4aaaea0ff069880f 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2008 Ullrich von Bassewitz                                       */
-/*               Roemerstrasse 52                                            */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2009, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -501,7 +501,7 @@ static void ParsePragma (void)
            break;
 
         case PR_WARN:
-            FlagPragma (&B, &WarnDisable);
+            FlagPragma (&B, &WarnEnable);
             break;
 
        case PR_ZPSYM:
index 4e4ebbc82cb778c767b658d60db232eac0faf2f5..dc246ef4b87f52d7b48c612490f0903cfea581a7 100644 (file)
@@ -164,9 +164,13 @@ static void CheckSymTable (SymTable* Tab)
            if (((Flags & SC_AUTO) || (Flags & SC_STATIC)) && (Flags & SC_EXTERN) == 0) {
                if (SymIsDef (Entry) && !SymIsRef (Entry)) {
                    if (Flags & SC_PARAM) {
-                       Warning ("Parameter `%s' is never used", Entry->Name);
+                        if (IS_Get (&WarnUnusedParam)) {
+                           Warning ("Parameter `%s' is never used", Entry->Name);
+                        }
                    } else {
-                       Warning ("`%s' is defined but never used", Entry->Name);
+                        if (IS_Get (&WarnUnusedVar)) {
+                            Warning ("`%s' is defined but never used", Entry->Name);
+                        }
                    }
                }
            }
@@ -177,8 +181,10 @@ static void CheckSymTable (SymTable* Tab)
                    /* Undefined label */
                    Error ("Undefined label: `%s'", Entry->Name);
                } else if (!SymIsRef (Entry)) {
-                   /* Defined but not used */
-                   Warning ("`%s' is defined but never used", Entry->Name);
+                   /* Defined but not used */ 
+                    if (IS_Get (&WarnUnusedLabel)) {
+                       Warning ("`%s' is defined but never used", Entry->Name);
+                    }
                }
            }