mirror of
https://github.com/nlohmann/json.git
synced 2026-07-21 19:23:03 +04:00
Guard <charconv> include with __has_include for GCC 7
GCC 7 sets __cplusplus to the C++17 value under -std=gnu++1z, so JSON_HAS_CPP_17 is defined, but its libstdc++ ships no <charconv> header (added in GCC 8; floating-point from_chars in GCC 11). The unconditional "#if defined(JSON_HAS_CPP_17) #include <charconv>" therefore failed to compile there: "fatal error: charconv: No such file or directory" in the ci_test_compilers_gcc (7) job. Wrap the include in __has_include(<charconv>), mirroring the library's existing handling of <version> and <filesystem> in macro_scope.hpp. When the header is absent, __cpp_lib_to_chars stays undefined and parse_float_from_chars() takes its scalar fallback, so the from_chars use site (already gated on __cpp_lib_to_chars) is never reached. GCC 8-10, which have <charconv> but no floating-point from_chars, are unaffected: they include the header but still take the fallback. GCC 11+ is unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AXcDtEma2PjxgmPS9cQGzA Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -16,9 +16,15 @@
|
|||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
#if defined(JSON_HAS_CPP_17)
|
// std::from_chars lives in <charconv>, but being in C++17 mode does not
|
||||||
#include <charconv> // from_chars (only used when __cpp_lib_to_chars is defined)
|
// guarantee the header exists: GCC 7 sets __cplusplus to C++17 yet ships no
|
||||||
#include <system_error> // errc
|
// <charconv> (added in GCC 8; floating-point support in GCC 11). Guard the
|
||||||
|
// include with __has_include so such toolchains fall back to the scalar path.
|
||||||
|
#if defined(JSON_HAS_CPP_17) && defined(__has_include)
|
||||||
|
#if __has_include(<charconv>)
|
||||||
|
#include <charconv> // from_chars (only used when __cpp_lib_to_chars is defined)
|
||||||
|
#include <system_error> // errc
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// This file contains the value-conversion helpers used by the lexer to turn an
|
// This file contains the value-conversion helpers used by the lexer to turn an
|
||||||
|
|||||||
@@ -7799,9 +7799,15 @@ NLOHMANN_JSON_NAMESPACE_END
|
|||||||
// #include <nlohmann/detail/macro_scope.hpp>
|
// #include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
|
|
||||||
#if defined(JSON_HAS_CPP_17)
|
// std::from_chars lives in <charconv>, but being in C++17 mode does not
|
||||||
#include <charconv> // from_chars (only used when __cpp_lib_to_chars is defined)
|
// guarantee the header exists: GCC 7 sets __cplusplus to C++17 yet ships no
|
||||||
#include <system_error> // errc
|
// <charconv> (added in GCC 8; floating-point support in GCC 11). Guard the
|
||||||
|
// include with __has_include so such toolchains fall back to the scalar path.
|
||||||
|
#if defined(JSON_HAS_CPP_17) && defined(__has_include)
|
||||||
|
#if __has_include(<charconv>)
|
||||||
|
#include <charconv> // from_chars (only used when __cpp_lib_to_chars is defined)
|
||||||
|
#include <system_error> // errc
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// This file contains the value-conversion helpers used by the lexer to turn an
|
// This file contains the value-conversion helpers used by the lexer to turn an
|
||||||
|
|||||||
Reference in New Issue
Block a user