The stack buffer used for the istream extraction operator does not need
to be zero-filled before we write to it. To prevent that zeroing from
happening automatically in C++26 we can use the [[indeterminate]]
attribute. For C++98 compatibility, __attribute__((uninitialized)) needs
to be used instead.

Also define a new variable for the array length which is never zero.
This avoids a -Walloc-size warning in C++98 where the new-expression is
not a discarded statement so the compiler sees `new _CharT[0]`:

include/bitset:1717: warning: allocation of insufficient size '0' for type 
'char' with size '1' [-Walloc-size]

libstdc++-v3/ChangeLog:

        * include/std/bitset (operator>>): Define __array_len to ensure
        that the array size is never zero. Add uninitialized attribute
        to __buf.
---

Tested x86_64-linux.

 libstdc++-v3/include/std/bitset | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index 469c8da9ece4..339f0c46cb5c 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -1706,6 +1706,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       typedef typename __istream_type::ios_base    __ios_base;
 
       static const bool __use_local = _Nb * sizeof(_CharT) <= 256;
+      static const size_t __array_len = _Nb != 0 ? _Nb : 1;
 
       struct _Buffer
       {
@@ -1714,7 +1715,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        _Buffer() : _M_ptr(_M_local)
        {
          if _GLIBCXX_CONSTEXPR (!__use_local)
-           _M_ptr = new _CharT[_Nb];
+           _M_ptr = new _CharT[__array_len];
        }
 
        ~_Buffer()
@@ -1725,8 +1726,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #pragma GCC diagnostic pop
 
        _CharT* _M_ptr;
-       _CharT _M_local[__use_local && _Nb != 0 ? _Nb : 1];
-      } __buf;
+       _CharT _M_local[__use_local ? __array_len : 1];
+      };
+      _Buffer __buf __attribute__((__uninitialized__));
 
       _CharT* __ptr = __buf._M_ptr;
 
-- 
2.55.0

Reply via email to