6 #include "diagnostic.h"
10 /** Number of occurred diagnostics. */
11 unsigned diagnostic_count = 0;
12 /** Number of occurred errors. */
13 unsigned error_count = 0;
14 /** Number of occurred warnings. */
15 unsigned warning_count = 0;
16 /** true if warnings should be inhibited */
17 bool inhibit_all_warnings = false;
18 /** true if warnings should be treated as errors */
19 bool warnings_are_errors = false;
20 /** true if the first error should stop the compilation */
21 bool fatal_errors = false;
24 * Issue a diagnostic message.
26 static void diagnosticvf(const char *const fmt, va_list ap)
28 for (const char* f = fmt; *f != '\0'; ++f) {
32 bool extended = false;
44 const wint_t val = va_arg(ap, wint_t);
50 const unsigned char val = (unsigned char) va_arg(ap, int);
56 const int val = va_arg(ap, int);
57 fprintf(stderr, "%d", val);
62 const char* const str = va_arg(ap, const char*);
68 const symbol_t *const symbol = va_arg(ap, const symbol_t*);
69 fputs(symbol->string, stderr);
74 const expression_t* const expr = va_arg(ap, const expression_t*);
75 print_expression(expr);
80 const unsigned qualifiers = va_arg(ap, unsigned);
81 print_type_qualifiers(qualifiers);
86 const type_t* const type = va_arg(ap, const type_t*);
87 const symbol_t* sym = NULL;
89 sym = va_arg(ap, const symbol_t*);
91 print_type_ext(type, sym, NULL);
96 const token_t* const token = va_arg(ap, const token_t*);
97 print_token(stderr, token);
104 va_list* toks = va_arg(ap, va_list*);
105 const char* const delimiter = va_arg(ap, const char*);
107 const token_type_t tok = va_arg(*toks, token_type_t);
113 fputs(delimiter, stderr);
115 print_token_type(stderr, tok);
118 const token_type_t token = va_arg(ap, token_type_t);
119 print_token_type(stderr, token);
125 panic("unknown format specifier");
133 void diagnosticf(const char *const fmt, ...)
138 diagnosticvf(fmt, ap);
142 static void errorvf(const source_position_t pos,
143 const char *const fmt, va_list ap)
145 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
147 diagnosticvf(fmt, ap);
153 void errorf(const source_position_t pos, const char *const fmt, ...)
157 errorvf(pos, fmt, ap);
164 static void warningvf(const source_position_t pos,
165 const char *const fmt, va_list ap)
167 fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
169 diagnosticvf(fmt, ap);
173 void warningf(const source_position_t pos, const char *const fmt, ...)
175 if (inhibit_all_warnings)
180 if (warnings_are_errors) {
181 errorvf(pos, fmt, ap);
183 warningvf(pos, fmt, ap);