aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-02-23 14:59:28 +0000
committergingerBill <bill@gingerbill.org>2021-02-23 14:59:28 +0000
commit01313eec7f11d5071996265bb654d92d4f598052 (patch)
treefe1633bd53063a46ed500bd1d41008115d86b061 /src
parenta1693c01847f9018ba4c4d9ec455157e34ebd6b3 (diff)
Add flags `-ignore-warnings` and `-warnings-as-errors`
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp10
-rw-r--r--src/main.cpp32
-rw-r--r--src/tokenizer.cpp65
3 files changed, 79 insertions, 28 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index b4c414f03..1557f8fe1 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -194,6 +194,9 @@ struct BuildContext {
bool disallow_do;
bool insert_semicolon;
+ bool ignore_warnings;
+ bool warnings_as_errors;
+
bool use_llvm_api;
bool use_subsystem_windows;
@@ -215,6 +218,13 @@ struct BuildContext {
gb_global BuildContext build_context = {0};
+bool global_warnings_as_errors(void) {
+ return build_context.warnings_as_errors;
+}
+bool global_ignore_warnings(void) {
+ return build_context.ignore_warnings;
+}
+
gb_global TargetMetrics target_windows_386 = {
TargetOs_windows,
diff --git a/src/main.cpp b/src/main.cpp
index 92e0b4104..2234c3c0e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -597,6 +597,9 @@ enum BuildFlagKind {
BuildFlag_Short,
BuildFlag_AllPackages,
+ BuildFlag_IgnoreWarnings,
+ BuildFlag_WarningsAsErrors,
+
#if defined(GB_SYSTEM_WINDOWS)
BuildFlag_IgnoreVsSearch,
BuildFlag_ResourceFile,
@@ -706,7 +709,8 @@ bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc);
add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc);
-
+ add_flag(&build_flags, BuildFlag_IgnoreWarnings, str_lit("ignore-warnings"), BuildFlagParam_None, Command_doc);
+ add_flag(&build_flags, BuildFlag_WarningsAsErrors, str_lit("warnings-as-errors"), BuildFlagParam_None, Command_doc);
#if defined(GB_SYSTEM_WINDOWS)
add_flag(&build_flags, BuildFlag_IgnoreVsSearch, str_lit("ignore-vs-search"), BuildFlagParam_None, Command__does_build);
@@ -1205,8 +1209,22 @@ bool parse_build_flags(Array<String> args) {
case BuildFlag_AllPackages:
build_context.cmd_doc_flags |= CmdDocFlag_AllPackages;
break;
-
-
+ case BuildFlag_IgnoreWarnings:
+ if (build_context.warnings_as_errors) {
+ gb_printf_err("-ignore-warnings cannot be used with -warnings-as-errors\n");
+ bad_flags = true;
+ } else {
+ build_context.ignore_warnings = true;
+ }
+ break;
+ case BuildFlag_WarningsAsErrors:
+ if (build_context.ignore_warnings) {
+ gb_printf_err("-warnings-as-errors cannot be used with -ignore-warnings\n");
+ bad_flags = true;
+ } else {
+ build_context.warnings_as_errors = true;
+ }
+ break;
#if defined(GB_SYSTEM_WINDOWS)
case BuildFlag_IgnoreVsSearch:
@@ -1697,6 +1715,14 @@ void print_show_help(String const arg0, String const &command) {
print_usage_line(1, "-default-to-nil-allocator");
print_usage_line(2, "Sets the default allocator to be the nil_allocator, an allocator which does nothing");
print_usage_line(0, "");
+
+ print_usage_line(1, "-ignore-warnings");
+ print_usage_line(2, "Ignores warning messages");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-warnings-as-errors");
+ print_usage_line(2, "Treats warning messages as error messages");
+ print_usage_line(0, "");
}
if (run_or_build) {
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp
index 66e42e737..3ef1e19fe 100644
--- a/src/tokenizer.cpp
+++ b/src/tokenizer.cpp
@@ -316,6 +316,10 @@ ERROR_OUT_PROC(default_error_out_va) {
ErrorOutProc *error_out_va = default_error_out_va;
+// NOTE: defined in build_settings.cpp
+bool global_warnings_as_errors(void);
+bool global_ignore_warnings(void);
+
void error_out(char const *fmt, ...) {
va_list va;
va_start(va, fmt);
@@ -323,22 +327,6 @@ void error_out(char const *fmt, ...) {
va_end(va);
}
-void warning_va(Token token, char const *fmt, va_list va) {
- gb_mutex_lock(&global_error_collector.mutex);
- global_error_collector.warning_count++;
- // NOTE(bill): Duplicate error, skip it
- if (token.pos.line == 0) {
- error_out("Warning: %s\n", gb_bprintf_va(fmt, va));
- } else if (global_error_collector.prev != token.pos) {
- global_error_collector.prev = token.pos;
- error_out("%.*s(%td:%td) Warning: %s\n",
- LIT(token.pos.file), token.pos.line, token.pos.column,
- gb_bprintf_va(fmt, va));
- }
-
- gb_mutex_unlock(&global_error_collector.mutex);
-}
-
void error_va(Token token, char const *fmt, va_list va) {
gb_mutex_lock(&global_error_collector.mutex);
@@ -358,6 +346,28 @@ void error_va(Token token, char const *fmt, va_list va) {
}
}
+void warning_va(Token token, char const *fmt, va_list va) {
+ if (global_warnings_as_errors()) {
+ error_va(token, fmt, va);
+ return;
+ }
+ gb_mutex_lock(&global_error_collector.mutex);
+ global_error_collector.warning_count++;
+ if (!global_ignore_warnings()) {
+ // NOTE(bill): Duplicate error, skip it
+ if (token.pos.line == 0) {
+ error_out("Warning: %s\n", gb_bprintf_va(fmt, va));
+ } else if (global_error_collector.prev != token.pos) {
+ global_error_collector.prev = token.pos;
+ error_out("%.*s(%td:%td) Warning: %s\n",
+ LIT(token.pos.file), token.pos.line, token.pos.column,
+ gb_bprintf_va(fmt, va));
+ }
+ }
+ gb_mutex_unlock(&global_error_collector.mutex);
+}
+
+
void error_line_va(char const *fmt, va_list va) {
gb_mutex_lock(&global_error_collector.mutex);
error_out_va(fmt, va);
@@ -403,18 +413,23 @@ void syntax_error_va(Token token, char const *fmt, va_list va) {
}
void syntax_warning_va(Token token, char const *fmt, va_list va) {
+ if (global_warnings_as_errors()) {
+ syntax_error_va(token, fmt, va);
+ return;
+ }
gb_mutex_lock(&global_error_collector.mutex);
global_error_collector.warning_count++;
- // NOTE(bill): Duplicate error, skip it
- if (global_error_collector.prev != token.pos) {
- global_error_collector.prev = token.pos;
- error_out("%.*s(%td:%td) Syntax Warning: %s\n",
- LIT(token.pos.file), token.pos.line, token.pos.column,
- gb_bprintf_va(fmt, va));
- } else if (token.pos.line == 0) {
- error_out("Warning: %s\n", gb_bprintf_va(fmt, va));
+ if (!global_ignore_warnings()) {
+ // NOTE(bill): Duplicate error, skip it
+ if (global_error_collector.prev != token.pos) {
+ global_error_collector.prev = token.pos;
+ error_out("%.*s(%td:%td) Syntax Warning: %s\n",
+ LIT(token.pos.file), token.pos.line, token.pos.column,
+ gb_bprintf_va(fmt, va));
+ } else if (token.pos.line == 0) {
+ error_out("Warning: %s\n", gb_bprintf_va(fmt, va));
+ }
}
-
gb_mutex_unlock(&global_error_collector.mutex);
}