diff --git a/cmake/detect_libcpp_version.cpp b/cmake/detect_libcpp_version.cpp new file mode 100644 index 000000000..a39322fcd --- /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 + +// see https://en.cppreference.com/w/cpp/header/ciso646 +#if __cplusplus >= 202002L + #include +#else + #include +#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 1bb998dae..14376f4ca 100644 --- a/cmake/download_test_data.cmake +++ b/cmake/download_test_data.cmake @@ -54,3 +54,18 @@ else() 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 b758d896b..3ff4ba309 100644 --- a/tests/src/unit-msgpack.cpp +++ b/tests/src/unit-msgpack.cpp @@ -1914,10 +1914,12 @@ TEST_CASE("MessagePack with std::byte") SECTION("empty vector") { const std::vector 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&); }