From 274b6b0c7a8b584662595762eaeff57d61c6807f Mon Sep 17 00:00:00 2001 From: Logan Smith Date: Wed, 22 Jul 2020 10:03:49 -0700 Subject: [PATCH] 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 --- llvm/cmake/modules/HandleLLVMOptions.cmake | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index f0e6a29..62dd0ef 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -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. -- 2.7.4