summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS11
-rw-r--r--doc/bison.texi22
-rw-r--r--src/complain.c89
-rw-r--r--tests/input.at32
-rw-r--r--tests/local.at5
5 files changed, 102 insertions, 57 deletions
diff --git a/NEWS b/NEWS
index bbdcc0f2..7a2d4b5c 100644
--- a/NEWS
+++ b/NEWS
@@ -4,7 +4,16 @@ GNU Bison NEWS
** Bug fixes
- Portability issues in the test suite.
+*** Portability issues in the test suite.
+
+*** Fixes of the -Werror option
+
+ Options such as "-Werror -Wno-error=foo" were still turning "foo"
+ diagnostics into errors instead of warnings. This is fixed.
+
+ Actually, for consistency with GCC, "-Wno-error=foo -Werror" now also
+ leaves "foo" diagnostics as warnings. Similarly, with "-Werror=foo
+ -Wno-error", "foo" diagnostics are now errors.
* Noteworthy changes in release 3.0 (2013-07-25) [stable]
diff --git a/doc/bison.texi b/doc/bison.texi
index 78d7d060..cd5e440e 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -10065,18 +10065,16 @@ A category can be turned off by prefixing its name with @samp{no-}. For
instance, @option{-Wno-yacc} will hide the warnings about
POSIX Yacc incompatibilities.
-@item -Werror[=@var{category}]
-@itemx -Wno-error[=@var{category}]
-Enable warnings falling in @var{category}, and treat them as errors. If no
-@var{category} is given, it defaults to making all enabled warnings into errors.
+@item -Werror
+Turn enabled warnings for every @var{category} into errors, unless they are
+explicitly disabled by @option{-Wno-error=@var{category}}.
+
+@item -Werror=@var{category}
+Enable warnings falling in @var{category}, and treat them as errors.
@var{category} is the same as for @option{--warnings}, with the exception that
it may not be prefixed with @samp{no-} (see above).
-Prefixed with @samp{no}, it deactivates the error treatment for this
-@var{category}. However, the warning itself won't be disabled, or enabled, by
-this option.
-
Note that the precedence of the @samp{=} and @samp{,} operators is such that
the following commands are @emph{not} equivalent, as the first will not treat
S/R conflicts as errors.
@@ -10086,6 +10084,14 @@ $ bison -Werror=yacc,conflicts-sr input.y
$ bison -Werror=yacc,error=conflicts-sr input.y
@end example
+@item -Wno-error
+Do not turn enabled warnings for every @var{category} into errors, unless
+they are explicitly enabled by @option{-Werror=@var{category}}.
+
+@item -Wno-error=@var{category}
+Deactivate the error treatment for this @var{category}. However, the warning
+itself won't be disabled, or enabled, by this option.
+
@item -f [@var{feature}]
@itemx --feature[=@var{feature}]
Activate miscellaneous @var{feature}. @var{feature} can be one of:
diff --git a/src/complain.c b/src/complain.c
index d2f3f4a2..115b7043 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -35,6 +35,17 @@ err_status complaint_status = status_none;
bool warnings_are_errors = false;
+/** Whether -Werror/-Wno-error was applied to a warning. */
+typedef enum
+ {
+ errority_unset = 0, /** No explict status. */
+ errority_disabled = 1, /** Explictly disabled with -Wno-error=foo. */
+ errority_enabled = 2 /** Explictly enabled with -Werror=foo. */
+ } errority;
+
+/** For each warning type, its errority. */
+static errority errority_flag[warnings_size];
+
/** Diagnostics severity. */
typedef enum
{
@@ -103,32 +114,26 @@ warning_argmatch (char const *arg, size_t no, size_t err)
no = !no;
}
- if (no)
- {
- size_t b;
- for (b = 0; b < warnings_size; ++b)
- if (value & 1 << b)
+ size_t b;
+ for (b = 0; b < warnings_size; ++b)
+ if (value & 1 << b)
+ {
+ if (err && no)
+ /* -Wno-error=foo. */
+ errority_flag[b] = errority_disabled;
+ else if (err && !no)
{
- if (err)
- {
- /* -Wno-error=foo: if foo enabled as an error,
- make it a warning. */
- if (warnings_flag[b] == severity_error)
- warnings_flag[b] = severity_warning;
- }
- else
- /* -Wno-foo. */
- warnings_flag[b] = severity_disabled;
+ /* -Werror=foo: enables -Wfoo. */
+ errority_flag[b] = errority_enabled;
+ warnings_flag[b] = severity_warning;
}
- }
- else
- {
- size_t b;
- for (b = 0; b < warnings_size; ++b)
- if (value & 1 << b)
- /* -Wfoo and -Werror=foo. */
- warnings_flag[b] = err ? severity_error : severity_warning;
- }
+ else if (no)
+ /* -Wno-foo. */
+ warnings_flag[b] = severity_disabled;
+ else
+ /* -Wfoo. */
+ warnings_flag[b] = severity_warning;
+ }
}
/** Decode a comma-separated list of arguments from -W.
@@ -145,10 +150,7 @@ warnings_argmatch (char *args)
if (STREQ (args, "error"))
warnings_are_errors = true;
else if (STREQ (args, "no-error"))
- {
- warnings_are_errors = false;
- warning_argmatch ("no-error=everything", 3, 6);
- }
+ warnings_are_errors = false;
else
{
// The length of the possible 'no-' prefix: 3, or 0.
@@ -176,27 +178,46 @@ complain_init (void)
size_t b;
for (b = 0; b < warnings_size; ++b)
- warnings_flag[b] = (1 << b & warnings_default
- ? severity_warning
- : severity_unset);
+ {
+ warnings_flag[b] = (1 << b & warnings_default
+ ? severity_warning
+ : severity_unset);
+ errority_flag[b] = errority_unset;
+ }
}
+
+/* A diagnostic with FLAGS is about to be issued. With what severity?
+ (severity_fatal, severity_error, severity_disabled, or
+ severity_warning.) */
+
static severity
warning_severity (warnings flags)
{
if (flags & fatal)
+ /* Diagnostics about fatal errors. */
return severity_fatal;
else if (flags & complaint)
+ /* Diagnostics about errors. */
return severity_error;
else
{
+ /* Diagnostics about warnings. */
severity res = severity_disabled;
size_t b;
for (b = 0; b < warnings_size; ++b)
if (flags & 1 << b)
- res = res < warnings_flag[b] ? warnings_flag[b] : res;
- if (res == severity_warning && warnings_are_errors)
- res = severity_error;
+ {
+ res = res < warnings_flag[b] ? warnings_flag[b] : res;
+ /* If the diagnostic is enabled, and -Werror is enabled,
+ and -Wno-error=foo was not explicitly requested, this
+ is an error. */
+ if (res == severity_warning
+ && (errority_flag[b] == errority_enabled
+ || (warnings_are_errors
+ && errority_flag[b] != errority_disabled)))
+ res = severity_error;
+ }
return res;
}
}
diff --git a/tests/input.at b/tests/input.at
index eb73bf96..4ddf955a 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -956,15 +956,9 @@ without_period: "WITHOUT.PERIOD";
AT_BISON_OPTION_POPDEFS
# POSIX Yacc accept periods, but not dashes.
-AT_BISON_CHECK([--yacc -Wno-error input.y], [], [],
-[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
-input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
-]])
-
-# So warn about them.
-AT_BISON_CHECK([-Wyacc input.y], [], [],
-[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
-input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
+AT_BISON_CHECK([--yacc input.y], [1], [],
+[[input.y:9.8-16: error: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Werror=yacc]
+input.y:20.8-16: error: POSIX Yacc forbids dashes in symbol names: with-dash [-Werror=yacc]
]])
# Dashes are fine for GNU Bison.
@@ -1768,11 +1762,11 @@ AT_BISON_CHECK([[-Dparse.lac.memory-trace=full input.y]],
AT_CLEANUP
-## --------------------------------------------- ##
-## -Werror is not affected by -Wnone and -Wall. ##
-## --------------------------------------------- ##
+## ---------------------- ##
+## -Werror combinations. ##
+## ---------------------- ##
-AT_SETUP([[-Werror is not affected by -Wnone and -Wall]])
+AT_SETUP([[-Werror combinations]])
AT_DATA([[input.y]],
[[%%
@@ -1798,6 +1792,18 @@ AT_BISON_CHECK([[-Werror,no-all,other input.y]], [[1]], [[]],
[[input.y:2.15: error: stray '$' [-Werror=other]
]])
+# Check that -Wno-error keeps warnings enabled, but non fatal.
+AT_BISON_CHECK([[-Werror -Wno-error=other input.y]], [[0]], [[]],
+[[input.y:2.15: warning: stray '$' [-Wother]
+]])
+
+AT_BISON_CHECK([[-Wno-error=other -Werror input.y]], [[0]], [[]],
+[[input.y:2.15: warning: stray '$' [-Wother]
+]])
+
+AT_BISON_CHECK([[-Werror=other -Wno-other input.y]], [[0]], [[]],
+[[]])
+
AT_CLEANUP
diff --git a/tests/local.at b/tests/local.at
index 7948faa5..ee00e009 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -635,9 +635,12 @@ m4_define([AT_BISON_CHECK_],
# ----------------------------------------------------------
# Check that warnings (if some are expected) are correctly
# turned into errors with -Werror, etc.
+#
+# When -Wno-error is used, the rules are really different, don't try.
m4_define([AT_BISON_CHECK_WARNINGS],
[m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
- [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
+ m4_bregexp([$1], [-Wno-error=]), [-1],
+ [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
m4_define([AT_BISON_CHECK_WARNINGS_],
[[# Defining POSIXLY_CORRECT causes bison to complain if options are