From 89eb3c76532c0c5f9f3207474c55c300a239fce8 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Wed, 1 Nov 2006 01:47:44 +0000 Subject: [PATCH] Finish implementing --warnings=error, which should not be implied by --warnings=all (or by its synonyms -W and --warnings without subarguments). * src/complain.c (set_warning_issued): New function to report that warnings are being treated as errors and to record an error if so. Invoke... (warn_at, warn): ... here. * src/getargs.c (warnings_args, warnings_types): Reorder so that "error - warnings are errors" does not appear above "all - all of the above". (getargs): For -W and --warnings without subarguments, don't let FLAGS_ARGMATCH set warnings_error in warnings_flag. * src/getargs.h (enum warnings): Unset warnings_error in warnings_all. --- ChangeLog | 16 ++++++++++++++++ src/complain.c | 15 +++++++++++++++ src/getargs.c | 11 +++++++---- src/getargs.h | 2 +- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index d64fa6bc..54906055 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2006-10-31 Joel E. Denny + + Finish implementing --warnings=error, which should not be implied by + --warnings=all (or by its synonyms -W and --warnings without + subarguments). + * src/complain.c (set_warning_issued): New function to report that + warnings are being treated as errors and to record an error if so. + Invoke... + (warn_at, warn): ... here. + * src/getargs.c (warnings_args, warnings_types): Reorder so that + "error - warnings are errors" does not appear above "all - all of the + above". + (getargs): For -W and --warnings without subarguments, don't let + FLAGS_ARGMATCH set warnings_error in warnings_flag. + * src/getargs.h (enum warnings): Unset warnings_error in warnings_all. + 2006-10-31 Joel E. Denny * src/getargs.c (flags_argmatch): Don't cause segmentation fault for diff --git a/src/complain.c b/src/complain.c index f3cd0ec1..7428a4af 100644 --- a/src/complain.c +++ b/src/complain.c @@ -28,6 +28,7 @@ #include "complain.h" #include "files.h" +#include "getargs.h" /* The calling program should define program_name and set it to the name of the executing program. */ @@ -79,15 +80,29 @@ error_message (location *loc, | Report a warning, and proceed. | `--------------------------------*/ +static void +set_warning_issued (void) +{ + static bool warning_issued = false; + if (!warning_issued && (warnings_flag & warnings_error)) + { + fprintf (stderr, "%s: warnings being treated as errors\n", program_name); + complaint_issued = true; + } + warning_issued = true; +} + void warn_at (location loc, const char *message, ...) { + set_warning_issued (); ERROR_MESSAGE (&loc, _("warning"), message); } void warn (const char *message, ...) { + set_warning_issued (); ERROR_MESSAGE (NULL, _("warning"), message); } diff --git a/src/getargs.c b/src/getargs.c index 94d24329..c34efa21 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -204,18 +204,18 @@ static const char * const warnings_args[] = /* In a series of synonyms, present the most meaningful first, so that argmatch_valid be more readable. */ "none - no warnings", - "error - warnings are errors", "yacc - incompatibilities with POSIX YACC", "all - all of the above", + "error - warnings are errors", 0 }; static const int warnings_types[] = { warnings_none, - warnings_error, warnings_yacc, - warnings_all + warnings_all, + warnings_error }; ARGMATCH_VERIFY (warnings_args, warnings_types); @@ -472,7 +472,10 @@ getargs (int argc, char *argv[]) break; case 'W': - FLAGS_ARGMATCH (warnings, optarg); + if (optarg) + FLAGS_ARGMATCH (warnings, optarg); + else + warnings_flag |= warnings_all; break; case LOCATIONS_OPTION: diff --git a/src/getargs.h b/src/getargs.h index d54a40b5..d0fa12f2 100644 --- a/src/getargs.h +++ b/src/getargs.h @@ -112,7 +112,7 @@ enum warnings warnings_none = 0, /**< Issue no warnings. */ warnings_error = 1 << 0, /**< Warnings are treated as errors. */ warnings_yacc = 1 << 1, /**< POSIXME. */ - warnings_all = ~0 /**< All of the above. */ + warnings_all = ~warnings_error /**< All above warnings. */ }; /** What warnings are issued. */ extern int warnings_flag; -- 2.45.2