Only enable -Wsuggest-override if it doesn't suggest adding override to functions that are already final

A previous patch added -Wsuggest-override using a simple add_flag_if_supported(). This causes lots of warnings in LLVM when building with older GCC versions (< 9.2) which suggest adding override to functions that are only marked final. The current flags in both GCC >=9.2 and Clang accept plain final as equivalent to override final.

This patch adds logic to detect versions of -Wsuggest-override that warn on void foo() final and disables them to avoid warning spam in builds using older GCC's. This has the added minor benefit of getting rid of the useless C_SUPPORTS_SUGGEST_OVERRIDE_FLAG CMake cache variable which was set by add_flag_if_supported().

Differential Revision: https://reviews.llvm.org/D84292
This commit is contained in:
Logan Smith 2020-07-22 10:03:49 -07:00
parent 5d745148d4
commit d6caaac68d

View File

@ -672,8 +672,20 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
# Enable -Wdelete-non-virtual-dtor if available.
add_flag_if_supported("-Wdelete-non-virtual-dtor" DELETE_NON_VIRTUAL_DTOR_FLAG)
# Enable -Wsuggest-override if available.
add_flag_if_supported("-Wsuggest-override" SUGGEST_OVERRIDE_FLAG)
# Enable -Wsuggest-override if it's available, and only if it doesn't
# suggest adding 'override' to functions that are already marked 'final'
# (which means it is disabled for GCC < 9.2).
check_cxx_compiler_flag("-Wsuggest-override" CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG)
if (CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG)
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror=suggest-override")
CHECK_CXX_SOURCE_COMPILES("class base {public: virtual void anchor();};
class derived : base {public: void anchor() final;};
int main() { return 0; }"
CXX_WSUGGEST_OVERRIDE_ALLOWS_ONLY_FINAL)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
append_if(CXX_WSUGGEST_OVERRIDE_ALLOWS_ONLY_FINAL "-Wsuggest-override" CMAKE_CXX_FLAGS)
endif()
# Check if -Wcomment is OK with an // comment ending with '\' if the next
# line is also a // comment.