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&); }