diff --git a/include/gsl/span b/include/gsl/span index 62a8dbd4..0de29323 100644 --- a/include/gsl/span +++ b/include/gsl/span @@ -63,6 +63,12 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" #endif +// Turn off clang unsafe buffer warnings as all accessed are guarded by runtime checks +#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif // defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") + namespace gsl { @@ -846,4 +852,8 @@ as_writable_bytes(span s) noexcept #pragma GCC diagnostic pop #endif // __GNUC__ > 6 +#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#pragma clang diagnostic pop +#endif + #endif // GSL_SPAN_H diff --git a/include/gsl/util b/include/gsl/util index 71f942df..b853017d 100644 --- a/include/gsl/util +++ b/include/gsl/util @@ -40,6 +40,12 @@ #endif // _MSC_VER +// Turn off clang unsafe buffer warnings as all accessed are guarded by runtime checks +#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif // defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") + #if defined(__cplusplus) && (__cplusplus >= 201703L) #define GSL_NODISCARD [[nodiscard]] #else @@ -154,4 +160,8 @@ constexpr auto at(std::span sp, const index i) -> decltype(sp[sp.size #endif // _MSC_VER +#if defined(__clang__) && __has_warning("-Wunsafe-buffer-usage") +#pragma clang diagnostic pop +#endif + #endif // GSL_UTIL_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 493285c9..519e4a40 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -123,11 +123,6 @@ if(MSVC) # MSVC or simulating MSVC if (WARN_RESERVED_ID) target_compile_options(gsl_tests_config INTERFACE "-Wno-reserved-identifier") endif() - check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER) - if (WARN_UNSAFE_BUFFER) - # This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer" - target_compile_options(gsl_tests_config INTERFACE "-Wno-unsafe-buffer-usage") - endif() else() target_compile_options(gsl_tests_config INTERFACE -fno-strict-aliasing @@ -191,6 +186,11 @@ else() > ) endif(MSVC) +check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER) +if (WARN_UNSAFE_BUFFER) + # This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer" + target_compile_options(gsl_tests_config INTERFACE "-Wno-unsafe-buffer-usage") +endif() # for tests to find the gtest header target_include_directories(gsl_tests_config SYSTEM INTERFACE @@ -262,11 +262,6 @@ if(MSVC) # MSVC or simulating MSVC if (WARN_RESERVED_ID) target_compile_options(gsl_tests_config_noexcept INTERFACE "-Wno-reserved-identifier") endif() - check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER) - if (WARN_UNSAFE_BUFFER) - # This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer" - target_compile_options(gsl_tests_config_noexcept INTERFACE "-Wno-unsafe-buffer-usage") - endif() else() target_compile_options(gsl_tests_config_noexcept INTERFACE -fno-exceptions @@ -307,6 +302,11 @@ else() > ) endif(MSVC) +check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER) +if (WARN_UNSAFE_BUFFER) + # This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer" + target_compile_options(gsl_tests_config_noexcept INTERFACE "-Wno-unsafe-buffer-usage") +endif() add_executable(gsl_noexcept_tests no_exception_ensure_tests.cpp) target_link_libraries(gsl_noexcept_tests diff --git a/tests/span_tests.cpp b/tests/span_tests.cpp index 44ae2052..d86458bd 100644 --- a/tests/span_tests.cpp +++ b/tests/span_tests.cpp @@ -333,7 +333,7 @@ TEST(span_test, from_array_constructor) EXPECT_TRUE(s.data() == std::addressof(arr2d[0])); } - int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + int arr3d[2][3][2] = { { {1, 2}, {3, 4}, {5, 6} }, { {7, 8}, {9, 10}, {11, 12} } }; #ifdef CONFIRM_COMPILATION_ERRORS {