From 2a1ef747b591ff68810f4c052f587662b150800e Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Tue, 10 Sep 2024 06:24:02 +0000 Subject: [PATCH] [libc++][string] Remove potential non-trailing 0-length array It is a violation of the standard to use 0 length arrays, especially when not at the end of a structure (not a FAM GNU extension). Compiler generally accept it, but it's probably better to have a conforming implementation. This is a re-application of #105865 which was reverted in 72cfc74 because it broke the data formatters. A LLDB patch has since been landed that should make this a non-issue. --- libcxx/include/string | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libcxx/include/string b/libcxx/include/string index 76359022f3650..fdb189016bfba 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -749,6 +749,14 @@ struct __can_be_converted_to_string_view struct __uninitialized_size_tag {}; struct __init_with_sentinel_tag {}; +template +struct __padding { + char __padding_[_PaddingSize]; +}; + +template <> +struct __padding<0> {}; + template class basic_string { private: @@ -853,7 +861,7 @@ private: struct __short { value_type __data_[__min_cap]; - unsigned char __padding_[sizeof(value_type) - 1]; + _LIBCPP_NO_UNIQUE_ADDRESS __padding __padding_; unsigned char __size_ : 7; unsigned char __is_long_ : 1; }; @@ -905,7 +913,7 @@ private: unsigned char __is_long_ : 1; unsigned char __size_ : 7; }; - char __padding_[sizeof(value_type) - 1]; + _LIBCPP_NO_UNIQUE_ADDRESS __padding __padding_; value_type __data_[__min_cap]; };