diff --git a/include/asm/warning.hpp b/include/asm/warning.hpp index 6862aeed..b479c983 100644 --- a/include/asm/warning.hpp +++ b/include/asm/warning.hpp @@ -7,8 +7,6 @@ #include "diagnostics.hpp" -extern unsigned int nbErrors; - enum WarningLevel { LEVEL_DEFAULT, // Warnings that are enabled by default LEVEL_ALL, // Warnings that probably indicate an error @@ -82,4 +80,7 @@ void error(char const *fmt, ...); // once. void error(std::function callback); +void forceError(); +void requireZeroErrors(); + #endif // RGBDS_ASM_WARNING_HPP diff --git a/src/asm/main.cpp b/src/asm/main.cpp index 1ca9ce96..35188150 100644 --- a/src/asm/main.cpp +++ b/src/asm/main.cpp @@ -418,8 +418,8 @@ int main(int argc, char *argv[]) { fstk_Init(mainFileName, maxDepth); // Perform parse (`yy::parser` is auto-generated from `parser.y`) - if (yy::parser parser; parser.parse() != 0 && nbErrors == 0) { - nbErrors = 1; + if (yy::parser parser; parser.parse() != 0) { + forceError(); } if (!fstk_FailedOnMissingInclude()) { @@ -432,10 +432,7 @@ int main(int argc, char *argv[]) { sect_CheckStack(); } - if (nbErrors != 0) { - fprintf(stderr, "Assembly aborted with %u error%s!\n", nbErrors, nbErrors == 1 ? "" : "s"); - exit(1); - } + requireZeroErrors(); // If parse aborted due to missing an include, and `-MG` was given, exit normally if (fstk_FailedOnMissingInclude()) { diff --git a/src/asm/warning.cpp b/src/asm/warning.cpp index afdb3e48..77b460fc 100644 --- a/src/asm/warning.cpp +++ b/src/asm/warning.cpp @@ -125,6 +125,19 @@ void fatal(char const *fmt, ...) { exit(1); } +void forceError() { + if (nbErrors == 0) { + nbErrors = 1; + } +} + +void requireZeroErrors() { + if (nbErrors != 0) { + fprintf(stderr, "Assembly aborted with %u error%s!\n", nbErrors, nbErrors == 1 ? "" : "s"); + exit(1); + } +} + void warning(WarningID id, char const *fmt, ...) { char const *flag = warnings.warningFlags[id].name; va_list args;