[libcxx-commits] [libcxx] [libc++][string] Remove potential non-trailing 0-length array (PR #108867)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Mon Sep 16 11:10:26 PDT 2024


https://github.com/ldionne created https://github.com/llvm/llvm-project/pull/108867

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.

>From 2a1ef747b591ff68810f4c052f587662b150800e Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
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 76359022f3650c..fdb189016bfbac 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 <size_t _PaddingSize>
+struct __padding {
+  char __padding_[_PaddingSize];
+};
+
+template <>
+struct __padding<0> {};
+
 template <class _CharT, class _Traits, class _Allocator>
 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<sizeof(value_type) - 1> __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<sizeof(value_type) - 1> __padding_;
     value_type __data_[__min_cap];
   };
 



More information about the libcxx-commits mailing list