#include "token_t.h"
#include "type.h"
-
//#define ABORT_ON_ERROR
/** Number of occurred diagnostics. */
unsigned error_count = 0;
/** Number of occurred warnings. */
unsigned warning_count = 0;
+/* true if warnings should be treated as errors */
+bool warnings_are_errors = false;
/**
* Issue a diagnostic message.
void errorf(const source_position_t pos, const char *const fmt, ...)
{
- ++error_count;
- fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
va_list ap;
va_start(ap, fmt);
+ fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
+ ++error_count;
diagnosticvf(fmt, ap);
va_end(ap);
fputc('\n', stderr);
void warningf(const source_position_t pos, const char *const fmt, ...)
{
- ++warning_count;
- fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
va_list ap;
va_start(ap, fmt);
+ if (warnings_are_errors) {
+ fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
+ ++error_count;
+ } else {
+ fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
+ ++warning_count;
+ }
diagnosticvf(fmt, ap);
va_end(ap);
fputc('\n', stderr);
extern unsigned error_count;
extern unsigned warning_count;
+/* true if warnings should be treated as errors */
+extern bool warnings_are_errors;
+
#endif
} else if (res == -1) {
help_displayed = true;
}
+ } else if(arg[0] == '-' && arg[1] == 'W') {
+ const char *opt;
+ GET_ARG_AFTER(opt, "-W");
+ if (strcmp(opt, "error") == 0) {
+ warnings_are_errors = true;
+ } else {
+ fprintf(stderr, "warning: ignoring gcc option -W%s\n", opt);
+ }
} else if(arg[0] == '-' && arg[1] == 'm') {
const char *opt;
GET_ARG_AFTER(opt, "-m");
} else if(strcmp(arg, "-pedantic") == 0) {
fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg);
} else if(arg[1] == 'O' ||
- arg[1] == 'W' ||
arg[1] == 'g' ||
strncmp(arg + 1, "std=", 4) == 0) {
fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg);