Browse Source

Add flags `-ignore-warnings` and `-warnings-as-errors`

gingerBill 4 years ago
parent
commit
01313eec7f
3 changed files with 79 additions and 28 deletions
  1. 10 0
      src/build_settings.cpp
  2. 29 3
      src/main.cpp
  3. 40 25
      src/tokenizer.cpp

+ 10 - 0
src/build_settings.cpp

@@ -194,6 +194,9 @@ struct BuildContext {
 	bool   disallow_do;
 	bool   disallow_do;
 	bool   insert_semicolon;
 	bool   insert_semicolon;
 
 
+	bool   ignore_warnings;
+	bool   warnings_as_errors;
+
 	bool   use_llvm_api;
 	bool   use_llvm_api;
 
 
 	bool   use_subsystem_windows;
 	bool   use_subsystem_windows;
@@ -215,6 +218,13 @@ struct BuildContext {
 
 
 gb_global BuildContext build_context = {0};
 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 = {
 gb_global TargetMetrics target_windows_386 = {
 	TargetOs_windows,
 	TargetOs_windows,

+ 29 - 3
src/main.cpp

@@ -597,6 +597,9 @@ enum BuildFlagKind {
 	BuildFlag_Short,
 	BuildFlag_Short,
 	BuildFlag_AllPackages,
 	BuildFlag_AllPackages,
 
 
+	BuildFlag_IgnoreWarnings,
+	BuildFlag_WarningsAsErrors,
+
 #if defined(GB_SYSTEM_WINDOWS)
 #if defined(GB_SYSTEM_WINDOWS)
 	BuildFlag_IgnoreVsSearch,
 	BuildFlag_IgnoreVsSearch,
 	BuildFlag_ResourceFile,
 	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_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_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)
 #if defined(GB_SYSTEM_WINDOWS)
 	add_flag(&build_flags, BuildFlag_IgnoreVsSearch, str_lit("ignore-vs-search"),  BuildFlagParam_None, Command__does_build);
 	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:
 						case BuildFlag_AllPackages:
 							build_context.cmd_doc_flags |= CmdDocFlag_AllPackages;
 							build_context.cmd_doc_flags |= CmdDocFlag_AllPackages;
 							break;
 							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)
 					#if defined(GB_SYSTEM_WINDOWS)
 						case BuildFlag_IgnoreVsSearch:
 						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(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(2, "Sets the default allocator to be the nil_allocator, an allocator which does nothing");
 		print_usage_line(0, "");
 		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) {
 	if (run_or_build) {

+ 40 - 25
src/tokenizer.cpp

@@ -316,6 +316,10 @@ ERROR_OUT_PROC(default_error_out_va) {
 
 
 ErrorOutProc *error_out_va = 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, ...) {
 void error_out(char const *fmt, ...) {
 	va_list va;
 	va_list va;
 	va_start(va, fmt);
 	va_start(va, fmt);
@@ -323,22 +327,6 @@ void error_out(char const *fmt, ...) {
 	va_end(va);
 	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) {
 void error_va(Token token, char const *fmt, va_list va) {
 	gb_mutex_lock(&global_error_collector.mutex);
 	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) {
 void error_line_va(char const *fmt, va_list va) {
 	gb_mutex_lock(&global_error_collector.mutex);
 	gb_mutex_lock(&global_error_collector.mutex);
 	error_out_va(fmt, va);
 	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) {
 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);
 	gb_mutex_lock(&global_error_collector.mutex);
 	global_error_collector.warning_count++;
 	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);
 	gb_mutex_unlock(&global_error_collector.mutex);
 }
 }