[compiler-rt] [compiler-rt] clang-cl: skip MSVC external-header probe; -std=c++ for unit-test compiles (PR #191564)

via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 10 16:00:01 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Alexandre Ganea (aganea)

<details>
<summary>Changes</summary>

1. `check_cxx_compiler_flag` marked `COMPILER_RT_HAS_EXTERNAL_FLAG` true for clang-cl, so `/experimental:external` and `/external:anglebrackets` were passed and clang-cl warned they were unused. Now only probe with real MSVC (not Clang); set the flag false otherwise; rely on that in asan/interception/ubsan.

2. Custom compile lines for unit tests didn’t get C++17, so headers hit `-Wc++17-extensions` (e.g. `constexpr if` / message-less `static_assert` in FuzzedDataProvider / asan_fake_stack). Now append `-std=c++${CMAKE_CXX_STANDARD}` or `-std=c++17` for C++ sources in `clang_compile()` for both standalone and non-standalone builds.

---
Full diff: https://github.com/llvm/llvm-project/pull/191564.diff


5 Files Affected:

- (modified) compiler-rt/cmake/Modules/CompilerRTCompile.cmake (+11) 
- (modified) compiler-rt/cmake/config-ix.cmake (+5-1) 
- (modified) compiler-rt/lib/asan/CMakeLists.txt (+1-3) 
- (modified) compiler-rt/lib/interception/CMakeLists.txt (+1-3) 
- (modified) compiler-rt/lib/ubsan/CMakeLists.txt (+1-3) 


``````````diff
diff --git a/compiler-rt/cmake/Modules/CompilerRTCompile.cmake b/compiler-rt/cmake/Modules/CompilerRTCompile.cmake
index 447ffd98fe570..aa50f71ce472a 100644
--- a/compiler-rt/cmake/Modules/CompilerRTCompile.cmake
+++ b/compiler-rt/cmake/Modules/CompilerRTCompile.cmake
@@ -101,6 +101,17 @@ function(clang_compile object_file source)
     set(compile_flags ${SOURCE_CFLAGS})
   endif()
 
+  # CMAKE_CXX_STANDARD is not propagated to these custom compile commands
+  # (add_custom_command). Add it explicitly for C++ files so that C++17
+  # features used in headers (e.g. if constexpr) don't trigger warnings.
+  if(is_cxx)
+    if(CMAKE_CXX_STANDARD)
+      list(APPEND compile_flags "-std=c++${CMAKE_CXX_STANDARD}")
+    else()
+      list(APPEND compile_flags "-std=c++17")
+    endif()
+  endif()
+
   string(REGEX MATCH "[.](m|mm)$" is_objc ${source_rpath})
   if (is_objc)
     list(APPEND compile_flags "-ObjC")
diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake
index 048ff06fd4a06..15be8d7aaf8b6 100644
--- a/compiler-rt/cmake/config-ix.cmake
+++ b/compiler-rt/cmake/config-ix.cmake
@@ -153,7 +153,11 @@ check_cxx_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC)
 check_cxx_compiler_flag(-Wno-format COMPILER_RT_HAS_WNO_FORMAT)
 check_cxx_compiler_flag(-Wno-format-pedantic COMPILER_RT_HAS_WNO_FORMAT_PEDANTIC)
 
-check_cxx_compiler_flag("/experimental:external /external:W0" COMPILER_RT_HAS_EXTERNAL_FLAG)
+if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  check_cxx_compiler_flag("/experimental:external /external:W0" COMPILER_RT_HAS_EXTERNAL_FLAG)
+else()
+  set(COMPILER_RT_HAS_EXTERNAL_FLAG FALSE)
+endif()
 
 check_cxx_compiler_flag(/W4 COMPILER_RT_HAS_W4_FLAG)
 check_cxx_compiler_flag(/WX COMPILER_RT_HAS_WX_FLAG)
diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt
index 232bb2574a778..6085f18426dff 100644
--- a/compiler-rt/lib/asan/CMakeLists.txt
+++ b/compiler-rt/lib/asan/CMakeLists.txt
@@ -120,9 +120,7 @@ set(ASAN_COMMON_DEFINITIONS "")
 append_rtti_flag(OFF ASAN_CFLAGS)
 
 # Silence warnings in system headers with MSVC.
-if(NOT CLANG_CL)
-  append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" ASAN_CFLAGS)
-endif()
+append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" ASAN_CFLAGS)
 
 # Too many existing bugs, needs cleanup.
 append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format ASAN_CFLAGS)
diff --git a/compiler-rt/lib/interception/CMakeLists.txt b/compiler-rt/lib/interception/CMakeLists.txt
index 57c8c8ba20141..db6419e51d577 100644
--- a/compiler-rt/lib/interception/CMakeLists.txt
+++ b/compiler-rt/lib/interception/CMakeLists.txt
@@ -30,9 +30,7 @@ set(INTERCEPTION_CFLAGS ${SANITIZER_COMMON_CFLAGS})
 append_rtti_flag(OFF INTERCEPTION_CFLAGS)
 
 # Silence warnings in system headers with MSVC.
-if(NOT CLANG_CL)
-  append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" INTERCEPTION_CFLAGS)
-endif()
+append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" INTERCEPTION_CFLAGS)
 
 add_compiler_rt_object_libraries(RTInterception
     OS ${SANITIZER_COMMON_SUPPORTED_OS}
diff --git a/compiler-rt/lib/ubsan/CMakeLists.txt b/compiler-rt/lib/ubsan/CMakeLists.txt
index f48db7c455bb8..75a4942debd3f 100644
--- a/compiler-rt/lib/ubsan/CMakeLists.txt
+++ b/compiler-rt/lib/ubsan/CMakeLists.txt
@@ -59,9 +59,7 @@ set(UBSAN_CXXFLAGS ${SANITIZER_COMMON_CFLAGS})
 append_rtti_flag(ON UBSAN_CXXFLAGS)
 
 # Silence warnings in system headers with MSVC.
-if(NOT CLANG_CL)
-  append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" UBSAN_CXXFLAGS)
-endif()
+append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" UBSAN_CXXFLAGS)
 
 set(UBSAN_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/191564


More information about the llvm-commits mailing list