cmake: Fix processing of -Wno-error= flags

Fix two bugs that happened to cancel each other out for cases covered
by our test suite.  Add a test case that distinguishes them.
This commit is contained in:
Brad King
2020-11-10 12:12:23 -05:00
parent c0619861c9
commit d800c26ce9
2 changed files with 12 additions and 3 deletions

View File

@@ -427,12 +427,12 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
bool foundError = false; bool foundError = false;
unsigned int nameStartPosition = 0; unsigned int nameStartPosition = 0;
if (entry.find("no-", nameStartPosition) == 0) { if (entry.find("no-", nameStartPosition) == nameStartPosition) {
foundNo = true; foundNo = true;
nameStartPosition += 3; nameStartPosition += 3;
} }
if (entry.find("error=", nameStartPosition) == 0) { if (entry.find("error=", nameStartPosition) == nameStartPosition) {
foundError = true; foundError = true;
nameStartPosition += 6; nameStartPosition += 6;
} }
@@ -454,7 +454,12 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
this->DiagLevels[name] = DIAG_ERROR; this->DiagLevels[name] = DIAG_ERROR;
} else { } else {
// -Wno-error=<name> // -Wno-error=<name>
this->DiagLevels[name] = std::min(this->DiagLevels[name], DIAG_WARN); // This can downgrade an error to a warning, but should not enable
// or disable a warning in the first place.
auto dli = this->DiagLevels.find(name);
if (dli != this->DiagLevels.end()) {
dli->second = std::min(dli->second, DIAG_WARN);
}
} }
} else if (cmHasLiteralPrefix(arg, "-U")) { } else if (cmHasLiteralPrefix(arg, "-U")) {
std::string entryPattern = arg.substr(2); std::string entryPattern = arg.substr(2);

View File

@@ -671,6 +671,10 @@ set(RunCMake_TEST_OPTIONS -Wno-error=deprecated)
run_cmake(Wno-error_deprecated) run_cmake(Wno-error_deprecated)
unset(RunCMake_TEST_OPTIONS) unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_OPTIONS -Werror=deprecated -Wno-error=deprecated)
run_cmake(Wno-error_deprecated)
unset(RunCMake_TEST_OPTIONS)
# Dev warnings should be on by default # Dev warnings should be on by default
run_cmake(Wdev) run_cmake(Wdev)