From 83bf9df04309405aa75283285bae58e91b225d26 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 11 Sep 2023 17:07:22 +0200 Subject: [PATCH] Utils: Fix fix for string size It was not using the whole short string size. Change-Id: Id6f6d4d0241ef74dbc0fe766bc1e19e8671e0b94 Reviewed-by: Tim Jenssen Reviewed-by: Qt CI Patch Build Bot --- src/libs/utils/smallstringlayout.h | 40 +++++++++--------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/src/libs/utils/smallstringlayout.h b/src/libs/utils/smallstringlayout.h index 03e764dfee3..0d87bd101ba 100644 --- a/src/libs/utils/smallstringlayout.h +++ b/src/libs/utils/smallstringlayout.h @@ -90,33 +90,25 @@ struct alignas(16) StringDataLayout , reference{{string}, size, 0} {} - QT_WARNING_PUSH - QT_WARNING_DISABLE_CLANG("-Wunsafe-buffer-usage") template constexpr StringDataLayout(const char (&string)[Size]) noexcept { - if constexpr (Size + 1 <= MaximumShortStringDataAreaSize) { - control = {Size - 1, false, false}; - for (size_type i = 0; i < Size; ++i) + constexpr auto size = Size - 1; + if constexpr (size <= MaximumShortStringDataAreaSize) { + control = {size, false, false}; + for (size_type i = 0; i < size; ++i) shortString[i] = string[i]; #if defined(__cpp_lib_is_constant_evaluated) && __cpp_lib_is_constant_evaluated >= 201811L if (std::is_constant_evaluated()) { - for (size_type i = Size; i < MaximumShortStringDataAreaSize; ++i) + for (size_type i = size; i < MaximumShortStringDataAreaSize; ++i) shortString[i] = 0; } #endif } else { control = {0, true, true}; -#if defined(__cpp_lib_is_constant_evaluated) && __cpp_lib_is_constant_evaluated >= 201811L - if (std::is_constant_evaluated()) { - for (size_type i = 0; i < sizeof(dummy); ++i) - dummy[i] = 0; - } -#endif - reference = {{string}, Size - 1, 0}; + reference = {{string}, size, 0}; } } - QT_WARNING_POP constexpr static size_type shortStringCapacity() noexcept { @@ -166,33 +158,25 @@ struct alignas(16) StringDataLayout constexpr StringDataLayout(const char (&string)[Size]) noexcept { - if constexpr (Size + 1 <= MaximumShortStringDataAreaSize) { - control = {Size - 1, false, false}; - for (size_type i = 0; i < Size; ++i) + constexpr auto size = Size - 1; + if constexpr (size <= MaximumShortStringDataAreaSize) { + control = {size, false, false}; + for (size_type i = 0; i < size; ++i) shortString[i] = string[i]; #if defined(__cpp_lib_is_constant_evaluated) && __cpp_lib_is_constant_evaluated >= 201811L if (std::is_constant_evaluated()) { - for (size_type i = Size; i < MaximumShortStringDataAreaSize; ++i) + for (size_type i = size; i < MaximumShortStringDataAreaSize; ++i) shortString[i] = 0; } #endif } else { control = {0, true, true}; -#if defined(__cpp_lib_is_constant_evaluated) && __cpp_lib_is_constant_evaluated >= 201811L - if (std::is_constant_evaluated()) { - for (size_type i = 0; i < sizeof(dummy); ++i) - dummy[i] = 0; - } -#endif - reference = {{string}, Size - 1, 0}; + reference = {{string}, size, 0}; } } - QT_WARNING_POP void copyHere(const StringDataLayout &other) noexcept {