From d800c26ce947c01dc32871614c137f7c9bdce3cb Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 10 Nov 2020 12:12:23 -0500 Subject: 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. --- Source/cmake.cxx | 11 ++++++++--- Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 4 ++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 4a2bb49..4fb0f2b 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -427,12 +427,12 @@ bool cmake::SetCacheArgs(const std::vector& args) bool foundError = false; unsigned int nameStartPosition = 0; - if (entry.find("no-", nameStartPosition) == 0) { + if (entry.find("no-", nameStartPosition) == nameStartPosition) { foundNo = true; nameStartPosition += 3; } - if (entry.find("error=", nameStartPosition) == 0) { + if (entry.find("error=", nameStartPosition) == nameStartPosition) { foundError = true; nameStartPosition += 6; } @@ -454,7 +454,12 @@ bool cmake::SetCacheArgs(const std::vector& args) this->DiagLevels[name] = DIAG_ERROR; } else { // -Wno-error= - 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")) { std::string entryPattern = arg.substr(2); diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake index c438860..bb40c52 100644 --- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake @@ -671,6 +671,10 @@ set(RunCMake_TEST_OPTIONS -Wno-error=deprecated) run_cmake(Wno-error_deprecated) 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 run_cmake(Wdev) -- cgit v0.12