From: Joel E. Denny Date: Sun, 27 Mar 2011 19:39:25 +0000 (-0400) Subject: Don't let -Wnone disable -Werror. X-Git-Tag: v2.5_rc1~11 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/dab9663283437092d17af8ede75f3aff33380d53?ds=inline Don't let -Wnone disable -Werror. Discussed at . * NEWS (2.5): Document. * src/getargs.c (flags_argmatch): Accept a new argument that specifies what flags "all" and thus "none" affect. (FLAGS_ARGMATCH): Update flags_argmatch invocation. * tests/input.at (-Werror is not affected by -Wnone and -Wall): New test group. --- diff --git a/ChangeLog b/ChangeLog index 07b11499..4eb5ebd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-03-27 Joel E. Denny + + Don't let -Wnone disable -Werror. + Discussed at + . + * NEWS (2.5): Document. + * src/getargs.c (flags_argmatch): Accept a new argument that + specifies what flags "all" and thus "none" affect. + (FLAGS_ARGMATCH): Update flags_argmatch invocation. + * tests/input.at (-Werror is not affected by -Wnone and -Wall): + New test group. + 2011-03-27 Joel E. Denny * NEWS (2.5): Document fix for -Wno-CATEGORY. diff --git a/NEWS b/NEWS index b8664833..243ada53 100644 --- a/NEWS +++ b/NEWS @@ -309,6 +309,13 @@ Bison News bison -Wall,no-yacc gram.y +*** The "none" category no longer disables a preceding "error": + + For example, for the following command line, Bison now reports + errors instead of warnings for incompatibilities with POSIX Yacc: + + bison -Werror,none,yacc gram.y + * Changes in version 2.4.3 (2010-08-05): ** Bison now obeys -Werror and --warnings=error for warnings about diff --git a/src/getargs.c b/src/getargs.c index d65cfc09..9c9f0c34 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -86,18 +86,19 @@ char *program_name; * \param option option being decoded. * \param keys array of valid subarguments. * \param values array of corresponding (int) values. + * \param all the all value. * \param flags the flags to update * \param args comma separated list of effective subarguments to decode. * If 0, then activate all the flags. * * If VALUE != 0 then KEY sets flags and no-KEY clears them. - * If VALUE == 0 then KEY clears all flags and no-KEY sets all flags. - * Thus no-none = all and no-all = none. + * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all + * flags from \c all. Thus no-none = all and no-all = none. */ static void flags_argmatch (const char *option, const char * const keys[], const int values[], - int *flags, char *args) + int all, int *flags, char *args) { if (args) { @@ -107,20 +108,24 @@ flags_argmatch (const char *option, int no = strncmp (args, "no-", 3) == 0 ? 3 : 0; int value = XARGMATCH (option, args + no, keys, values); if (value == 0) - if (no) - *flags = ~0; - else - *flags = 0; + { + if (no) + *flags |= all; + else + *flags &= ~all; + } else - if (no) - *flags &= ~value; - else - *flags |= value; + { + if (no) + *flags &= ~value; + else + *flags |= value; + } args = strtok (NULL, ","); } } else - *flags = ~0; + *flags |= all; } /** Decode a set of sub arguments. @@ -130,11 +135,12 @@ flags_argmatch (const char *option, * * \arg FlagName_args the list of keys. * \arg FlagName_types the list of values. + * \arg FlagName_all the all value. * \arg FlagName_flag the flag to update. */ #define FLAGS_ARGMATCH(FlagName, Args) \ flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \ - &FlagName ## _flag, Args) + FlagName ## _all, &FlagName ## _flag, Args) /*----------------------. @@ -579,10 +585,7 @@ getargs (int argc, char *argv[]) exit (EXIT_SUCCESS); case 'W': - if (optarg) - FLAGS_ARGMATCH (warnings, optarg); - else - warnings_flag |= warnings_all; + FLAGS_ARGMATCH (warnings, optarg); break; case 'b': diff --git a/tests/input.at b/tests/input.at index 9acd5448..c8e28be7 100644 --- a/tests/input.at +++ b/tests/input.at @@ -1308,3 +1308,36 @@ AT_BISON_CHECK([[-Dparse.lac.memory-trace=full input.y]], ]]) AT_CLEANUP + +## --------------------------------------------- ## +## -Werror is not affected by -Wnone and -Wall. ## +## --------------------------------------------- ## + +AT_SETUP([[-Werror is not affected by -Wnone and -Wall]]) + +AT_DATA([[input.y]], +[[%% +foo-bar: ; +]]) + +# -Werror is not enabled by -Wall or equivalent. +AT_BISON_CHECK([[-Wall input.y]], [[0]], [[]], +[[input.y:2.1-7: warning: POSIX Yacc forbids dashes in symbol names: foo-bar +]]) +AT_BISON_CHECK([[-W input.y]], [[0]], [[]], +[[input.y:2.1-7: warning: POSIX Yacc forbids dashes in symbol names: foo-bar +]]) +AT_BISON_CHECK([[-Wno-none input.y]], [[0]], [[]], +[[input.y:2.1-7: warning: POSIX Yacc forbids dashes in symbol names: foo-bar +]]) + +# -Werror is not disabled by -Wnone or equivalent. +AT_BISON_CHECK([[-Werror,none,yacc input.y]], [[1]], [[]], [[stderr]]) +AT_CHECK([[sed 's/^.*bison:/bison:/' stderr]], [[0]], +[[bison: warnings being treated as errors +input.y:2.1-7: warning: POSIX Yacc forbids dashes in symbol names: foo-bar +]]) +[mv stderr experr] +AT_BISON_CHECK([[-Werror,no-all,yacc input.y]], [[1]], [[]], [[experr]]) + +AT_CLEANUP