@@ -88,6 +88,8 @@ set(CLANG_LT_13_CXX_WARNING_FLAGS "-Wreserved-id-macro")
8888set (CLANG_GE_13_CXX_WARNING_FLAGS "-Wreserved-identifier" )
8989# Do not enable clang 16+ -Wunsafe-buffer-usage because it warns on all memcpy
9090# calls and our pointer- and span-like class implementations.
91+ set (CLANG_GE_21_CXX_WARNING_FLAGS "-Wnrvo" "-Wunique-object-duplication"
92+ "-Wshift-bool" "-Wc99-designator" "-Wms-bitfield-padding" )
9193
9294set (GCC_CXX_WARNING_FLAGS
9395 # Warning groups
@@ -296,10 +298,17 @@ if(SANITIZE_UB)
296298 if (is_clang AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0)
297299 list (APPEND SANITIZER_CXX_FLAGS "-fsanitize=implicit-bitfield-conversion" )
298300 endif ()
301+ if (is_clang AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 21.0)
302+ list (APPEND SANITIZER_CXX_FLAGS "-fsanitize=vptr" )
303+ endif ()
299304 endif ()
300305
301306 set (SANITIZER_LD_FLAGS "-fsanitize=undefined" )
302307
308+ if (is_clang AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 21.0)
309+ list (APPEND SANITIZER_LD_FLAGS "-fsanitize=vptr" )
310+ endif ()
311+
303312 string (CONCAT UBSAN_ENV "UBSAN_OPTIONS="
304313 "print_stacktrace=1:halt_on_error=1:abort_on_error=1" )
305314
@@ -402,9 +411,13 @@ set(cxx_ge_12 "$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,12.0>")
402411set (cxx_lt_13 "$<VERSION_LESS :$<CXX_COMPILER_VERSION >,13.0>" )
403412set (cxx_ge_13 "$<VERSION_GREATER_EQUAL :$<CXX_COMPILER_VERSION >,13.0>" )
404413set (cxx_ge_14 "$<VERSION_GREATER_EQUAL :$<CXX_COMPILER_VERSION >,14.0>" )
414+ set (cxx_ge_21 "$<VERSION_GREATER_EQUAL :$<CXX_COMPILER_VERSION >,21.0>" )
405415set (is_clang_lt_13_not_windows "$<AND :${is_clang_not_windows} ,${cxx_lt_13} >" )
406416set (is_clang_ge_13_not_windows "$<AND :${is_clang_not_windows} ,${cxx_ge_13} >" )
407417set (is_clang_ge_14_not_windows "$<AND :${is_clang_not_windows} ,${cxx_ge_14} >" )
418+ set (is_clang_ge_21_not_windows "$<AND :${is_clang_not_windows} ,${cxx_ge_21} >" )
419+ set (is_darwin_clang_ge_21_x86_64 "$<AND :$<PLATFORM_ID :Darwin >,${is_clang_ge_21_not_windows} ,${is_not_windows_x86_64} >" )
420+ set (is_darwin_clang_ge_21_arm64 "$<AND :$<PLATFORM_ID :Darwin >,${is_clang_ge_21_not_windows} ,$<NOT :${is_not_windows_x86_64} >>" )
408421set (is_gxx_ge_11 "$<AND :${is_gxx_genex} ,${cxx_ge_11} >" )
409422set (is_gxx_ge_12 "$<AND :${is_gxx_genex} ,${cxx_ge_12} >" )
410423set (is_gxx_ge_14 "$<AND :${is_gxx_genex} ,${cxx_ge_14} >" )
@@ -616,6 +629,10 @@ else()
616629 else ()
617630 message (STATUS "clang-tidy found: ${CLANG_TIDY_EXE} " )
618631 set (DO_CLANG_TIDY "${CLANG_TIDY_EXE} " "-p=${CMAKE_BINARY_DIR} " )
632+ # Add suppression for unknown warning options when clang-tidy might not
633+ # recognize all compiler warning flags (e.g., when scan-build from LLVM 21
634+ # wraps the build)
635+ list (APPEND DO_CLANG_TIDY "--extra-arg=-Wno-unknown-warning-option" )
619636 endif ()
620637endif ()
621638
@@ -674,7 +691,9 @@ if(IWYU)
674691 IWYU_VERSION_OUTPUT )
675692 message (STATUS
676693 "include-what-you-use found: ${IWYU_EXE} , --version: ${IWYU_VERSION_OUTPUT} " )
677- set (DO_IWYU "${IWYU_EXE} " )
694+ # IWYU is not necessarily based on the same version clang is and might not
695+ # understand newer options
696+ set (DO_IWYU "${IWYU_EXE} ;-Wno-unknown-warning-option" )
678697 endif ()
679698 endif ()
680699endif ()
@@ -709,6 +728,7 @@ function(COMMON_TARGET_PROPERTIES TARGET)
709728 "$<$<AND :${is_standalone} ,${is_any_clang_genex} ,${is_not_windows} >:${CLANG_CXX_WARNING_FLAGS} >"
710729 "$<$<AND :${is_standalone} ,${is_clang_lt_13_not_windows} >:${CLANG_LT_13_CXX_WARNING_FLAGS} >"
711730 "$<$<AND :${is_standalone} ,${is_clang_ge_13_not_windows} >:${CLANG_GE_13_CXX_WARNING_FLAGS} >"
731+ "$<$<AND :${is_standalone} ,${is_clang_ge_21_not_windows} >:${CLANG_GE_21_CXX_WARNING_FLAGS} >"
712732 "$<$<AND :${is_standalone} ,${is_gxx_genex} >:${GCC_CXX_WARNING_FLAGS} >"
713733 "$<$<AND :${is_standalone} ,${is_gxx_ge_11} >:${GCC_GE_11_CXX_WARNING_FLAGS} >"
714734 "$<$<AND :${is_standalone} ,${is_gxx_ge_12} >:${GCC_GE_12_CXX_WARNING_FLAGS} >"
@@ -721,6 +741,10 @@ function(COMMON_TARGET_PROPERTIES TARGET)
721741 target_link_options (${TARGET} INTERFACE "$<${coverage_on} :--coverage >" )
722742 target_link_options (${TARGET} PRIVATE
723743 "$<${is_apple_clang_genex} :-Wl ,-no_warn_duplicate_libraries >"
744+ "$<${is_darwin_clang_ge_21_x86_64} :-L /usr /local /opt /llvm /lib /c ++>"
745+ "$<${is_darwin_clang_ge_21_x86_64} :-Wl ,-rpath ,/usr /local /opt /llvm /lib /c ++>"
746+ "$<${is_darwin_clang_ge_21_arm64} :-L /opt /homebrew /opt /llvm /lib /c ++>"
747+ "$<${is_darwin_clang_ge_21_arm64} :-Wl ,-rpath ,/opt /homebrew /opt /llvm /lib /c ++>"
724748 "${SANITIZER_LD_FLAGS} "
725749 )
726750 target_link_libraries (${TARGET} PRIVATE
0 commit comments