]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Support constexpr global std::string for size < 15 [PR105995]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 16 Jun 2022 13:57:32 +0000 (14:57 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 16 Jun 2022 19:20:40 +0000 (20:20 +0100)
I don't think this is required by the standard, but it's easy to
support.

libstdc++-v3/ChangeLog:

PR libstdc++/105995
* include/bits/basic_string.h (_M_use_local_data): Initialize
the entire SSO buffer.
* testsuite/21_strings/basic_string/cons/char/105995.cc: New test.

libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/testsuite/21_strings/basic_string/cons/char/105995.cc [new file with mode: 0644]

index 57247e306dc5878b6b45c6195f82eacb77e47630..b04fba956783fdcea83deaab763b6744787583c5 100644 (file)
@@ -352,7 +352,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       {
 #if __cpp_lib_is_constant_evaluated
        if (std::is_constant_evaluated())
-         _M_local_buf[0] = _CharT();
+         for (_CharT& __c : _M_local_buf)
+           __c = _CharT();
 #endif
        return _M_local_data();
       }
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/105995.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/105995.cc
new file mode 100644 (file)
index 0000000..aa8bcba
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-options "-std=gnu++20" }
+// { dg-do compile { target c++20 } }
+// { dg-require-effective-target cxx11_abi }
+
+// PR libstdc++/105995
+// Not required by the standard, but supported for QoI.
+constexpr std::string pr105995_empty;
+constexpr std::string pr105995_partial = "0";
+constexpr std::string pr105995_full = "0123456789abcde";