From 01313eec7f11d5071996265bb654d92d4f598052 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Feb 2021 14:59:28 +0000 Subject: [PATCH] Add flags `-ignore-warnings` and `-warnings-as-errors` --- src/build_settings.cpp | 10 +++++++ src/main.cpp | 32 +++++++++++++++++++-- src/tokenizer.cpp | 65 ++++++++++++++++++++++++++---------------- 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 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 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); }