From 125e8487b9b59cbb59bb2c5594ace12e63e4afc3 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 29 Nov 2019 14:44:28 +0100 Subject: [PATCH] [cmake] Disable GCC 9's -Wredundant-move Summary: This new warning (enabled by -Wextra) fires when a std::move is redundant, as the default compiler behavior would be to select a move operation anyway (e.g., when returning a local variable). Unlike -Wpessimizing-move, it has no performance impact -- it just adds noise. Currently llvm has about 1500 of these warnings. Unfortunately, the suggested fix -- removing std::move -- does not work because of some older compilers we still support. Specifically clang<=3.8 will not use a move operation if an implicit conversion is needed (Core issue 1579). In code like "A f(ConvertibleToA a) { return a; }" it will prefer a copy, or fail to compile if a copy is not possible. This patch disables that warning to get a meaningful signal out of a GCC 9 build. Reviewers: rnk, aaron.ballman, xbolva00 Subscribers: mgorny, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70963 --- cmake/modules/HandleLLVMOptions.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index 9408eb94af2..ab219e52f9d 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -610,6 +610,16 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)) check_cxx_compiler_flag("-Wclass-memaccess" CXX_SUPPORTS_CLASS_MEMACCESS_FLAG) append_if(CXX_SUPPORTS_CLASS_MEMACCESS_FLAG "-Wno-class-memaccess" CMAKE_CXX_FLAGS) + # Disable -Wredundant-move on GCC>=9. GCC wants to remove std::move in code + # like "A foo(ConvertibleToA a) { return std::move(a); }", but this code does + # not compile (or uses the copy constructor instead) on clang<=3.8. Clang also + # has a -Wredundant-move, but it only fires when the types match exactly, so + # we can keep it here. + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + check_cxx_compiler_flag("-Wredundant-move" CXX_SUPPORTS_REDUNDANT_MOVE_FLAG) + append_if(CXX_SUPPORTS_REDUNDANT_MOVE_FLAG "-Wno-redundant-move" CMAKE_CXX_FLAGS) + endif() + # The LLVM libraries have no stable C++ API, so -Wnoexcept-type is not useful. check_cxx_compiler_flag("-Wnoexcept-type" CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG) append_if(CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG "-Wno-noexcept-type" CMAKE_CXX_FLAGS)