[gcc r9-9590] libstdc++: Simplify constexpr checks in std::char_traits [PR 91488]
Jonathan Wakely
redi@gcc.gnu.org
Fri Jun 18 14:43:29 GMT 2021
https://gcc.gnu.org/g:cc44169fc7bc7552eb85f143f4fee9c8bcdd5e49
commit r9-9590-gcc44169fc7bc7552eb85f143f4fee9c8bcdd5e49
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu Jun 17 14:11:22 2021 +0100
libstdc++: Simplify constexpr checks in std::char_traits [PR 91488]
This removes the 'static' keyword from the helper functions added by
r8-1294 to detect whether the char_traits member functions can be
evaluated at compile time. This prevents the "inlining failed" error
reported in the PR.
The new testcase from the PR is added to the libitm testsuite, because
that's where we can be sure it's OK to use the -fgnu-tm option.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/91488
libstdc++-v3/ChangeLog:
* include/bits/char_traits.h (__constant_string_p)
(__constant_array_p): Give external linkage.
libitm/ChangeLog:
* testsuite/libitm.c++/libstdc++-pr91488.C: New test.
(cherry picked from commit b376b1ef38971b84975ad1540bf5d2ae0b924e76)
Diff:
---
libitm/testsuite/libitm.c++/libstdc++-pr91488.C | 9 +++++++++
libstdc++-v3/include/bits/char_traits.h | 4 ++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/libitm/testsuite/libitm.c++/libstdc++-pr91488.C b/libitm/testsuite/libitm.c++/libstdc++-pr91488.C
new file mode 100644
index 00000000000..e9e82bd1ce2
--- /dev/null
+++ b/libitm/testsuite/libitm.c++/libstdc++-pr91488.C
@@ -0,0 +1,9 @@
+// PR libstdc++/91488 "inlining failed in call to always_inline"
+// { dg-do run }
+// { dg-additional-options "-O1" }
+
+#include <string>
+
+int main() {
+ return std::char_traits<char>::length("");
+}
diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h
index 50bd25eb2df..4c7b84e357f 100644
--- a/libstdc++-v3/include/bits/char_traits.h
+++ b/libstdc++-v3/include/bits/char_traits.h
@@ -227,7 +227,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* Assumes that _CharT is a built-in character type.
*/
template<typename _CharT>
- static _GLIBCXX_ALWAYS_INLINE constexpr bool
+ _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_string_p(const _CharT* __s)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
@@ -250,7 +250,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* Assumes that _CharT is a built-in character type.
*/
template<typename _CharT>
- static _GLIBCXX_ALWAYS_INLINE constexpr bool
+ _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_char_array_p(const _CharT* __a, size_t __n)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
More information about the Libstdc++-cvs
mailing list