From 3f0f5e0ae4355c90a791fd36e059bd5e0c2249fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Jen=C3=9Fen?= Date: Fri, 14 Mar 2025 12:32:39 +0100 Subject: [PATCH] QmlDesigner: proper std::to_chars float fallback On older toolchains (e.g., RHEL 8, macOS < 13.3), std::to_chars for floating-point types is may be partially implemented. Task-number: QDS-14932 Change-Id: I63b17d640efa240e223f506333538a54b121de2c Reviewed-by: Marco Bubke --- src/libs/nanotrace/staticstring.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/libs/nanotrace/staticstring.h b/src/libs/nanotrace/staticstring.h index d787bd2fe30..0cd85ae5fca 100644 --- a/src/libs/nanotrace/staticstring.h +++ b/src/libs/nanotrace/staticstring.h @@ -5,14 +5,17 @@ #include -#if !(defined(__cpp_lib_to_chars) && (__cpp_lib_to_chars >= 201611L)) -# include -#endif - #include #include #include +#if !defined(__cpp_lib_to_chars) || (__cpp_lib_to_chars < 201611L) || \ + (defined(__GNUC__) && __GNUC__ < 11) || \ + (defined(_MSC_VER) && _MSC_VER < 1930) || \ + (defined(__clang_major__) && __clang_major__ < 14) +#define NO_STD_FLOAT_TO_CHARS 1 +#endif + namespace NanotraceHR { template @@ -58,10 +61,14 @@ public: template, bool> = true> void append(Type number) { -#if !(defined(__cpp_lib_to_chars) && (__cpp_lib_to_chars >= 201611L)) +#if NO_STD_FLOAT_TO_CHARS + // Fallback using snprintf with sufficient precision. if constexpr (std::is_floating_point_v) { - QLocale locale{QLocale::Language::C}; - append(locale.toString(number).toStdString()); + char buffer[std::numeric_limits::max_digits10 + 2]; + auto size = std::snprintf(buffer, sizeof(buffer), "%.9f", number); + + if (size >= 0) + append({buffer, size}); return; } #endif