Repository: microsoft/GSL (language: cpp)

Issue:
Can not build with gcc13 because suggestion warning
```
/work2/00434/eijkhout/msgsl/msgsl-4.0.0/tests/span_tests.cpp:333:33: error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces]
    int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
                                ^~~~
                                {   }
```

Can I turn off the `Werror`? Alternatively, this seems to be non-essential testing code, so can I not build the tests?


Discussion / hints:
Hi @VictorEijkhout, I'll bring this up in the next maintainers' sync.
> Alternatively, this seems to be non-essential testing code, so can I not build the tests?

You can set `-D GSL_TEST=OFF` when configuring the CMake build.

This is also what `vcpkg` does in it's `portfile`.

https://github.com/microsoft/vcpkg/blob/b40de44891dc1cab11d4722094ae44807a837b98/ports/ms-gsl/portfile.cmake#L13
Maintainers call: Yes this should be

    int arr3d[2][3][2] = { { {1, 2}, {3, 4}, {5, 6} }, { {7, 8}, {9, 10}, {11, 12} } };

Fix patch:
diff --git a/include/gsl/span b/include/gsl/span
index 3f82a5e9..d71d813f 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<ElementType, Extent> 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<T, extent> 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


Test patch:
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
     {