Detect used C++ standard library (#4793)

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
diff --git a/cmake/detect_libcpp_version.cpp b/cmake/detect_libcpp_version.cpp
new file mode 100644
index 0000000..a39322f
--- /dev/null
+++ b/cmake/detect_libcpp_version.cpp
@@ -0,0 +1,31 @@
+/*
+ * Detect used C++ Standard Library
+ *
+ * This file is compiled and run via try_run in download_test_data.cmake.
+ */
+
+#include <cstdio>
+
+// see https://en.cppreference.com/w/cpp/header/ciso646
+#if __cplusplus >= 202002L
+    #include <version>
+#else
+    #include <ciso646>
+#endif
+
+int main()
+{
+#if defined(_LIBCPP_VERSION)
+    std::printf("LLVM C++ Standard Library (libc++), _LIBCPP_VERSION=%d", _LIBCPP_VERSION);
+#elif defined(__GLIBCXX__)
+    std::printf("GNU C++ Standard Library (libstdc++), __GLIBCXX__=%d", __GLIBCXX__);
+#elif defined(_MSVC_STL_VERSION)
+    std::printf("Microsoft C++ Standard Library (MSVC STL), _MSVC_STL_VERSION=%d", _MSVC_STL_VERSION);
+#elif defined(_LIBCUDACXX_VERSION)
+    std::printf("NVIDIA C++ Standard Library (libcudacxx), _LIBCUDACXX_VERSION=%d", _LIBCUDACXX_VERSION);
+#elif defined(EASTL_VERSION)
+    std::printf("Electronic Arts Standard Template Library (EASTL), EASTL_VERSION=%d", EASTL_VERSION);
+#else
+    std::printf("unknown");
+#endif
+}
diff --git a/cmake/download_test_data.cmake b/cmake/download_test_data.cmake
index 1bb998d..14376f4 100644
--- a/cmake/download_test_data.cmake
+++ b/cmake/download_test_data.cmake
@@ -54,3 +54,18 @@
 endif()
 string(REGEX REPLACE "[ ]*\n" "; " CXX_VERSION_RESULT "${CXX_VERSION_RESULT}")
 message(STATUS "Compiler: ${CXX_VERSION_RESULT}")
+
+# determine used C++ standard library (for debug and support purposes)
+if(NOT DEFINED LIBCPP_VERSION_OUTPUT_CACHED)
+    try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR
+        "${CMAKE_BINARY_DIR}" SOURCES "${CMAKE_SOURCE_DIR}/cmake/detect_libcpp_version.cpp"
+        RUN_OUTPUT_VARIABLE LIBCPP_VERSION_OUTPUT COMPILE_OUTPUT_VARIABLE LIBCPP_VERSION_COMPILE_OUTPUT
+    )
+    if(NOT LIBCPP_VERSION_OUTPUT)
+        set(LIBCPP_VERSION_OUTPUT "Unknown")
+        message(AUTHOR_WARNING "Failed to compile cmake/detect_libcpp_version to detect the used C++ standard library. This does not affect the library or the test cases. Please still create an issue at https://github.com/nlohmann/json to investigate this.\n${LIBCPP_VERSION_COMPILE_OUTPUT}")
+    endif()
+    set(LIBCPP_VERSION_OUTPUT_CACHED "${LIBCPP_VERSION_OUTPUT}" CACHE STRING "Detected C++ standard library version")
+endif()
+
+message(STATUS "C++ standard library: ${LIBCPP_VERSION_OUTPUT_CACHED}")
diff --git a/tests/src/unit-msgpack.cpp b/tests/src/unit-msgpack.cpp
index b758d89..3ff4ba3 100644
--- a/tests/src/unit-msgpack.cpp
+++ b/tests/src/unit-msgpack.cpp
@@ -1914,10 +1914,12 @@
         SECTION("empty vector")
         {
             const std::vector<std::byte> empty_data;
-            CHECK_THROWS_WITH_AS([&]() {
+            CHECK_THROWS_WITH_AS([&]()
+            {
                 [[maybe_unused]] auto result = json::from_msgpack(empty_data);
                 return true;
-            }(),
+            }
+            (),
             "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing MessagePack value: unexpected end of input",
             json::parse_error&);
         }