re PR ipa/86590 (Codegen is poor when passing std::string by value with _GLIBCXX_EXTERN_TEMPLATE undefined)

PR libstdc++/86590
	* include/bits/char_traits.h (__constant_string_p,
	__constant_char_array_p): Use __builtin_is_constant_evaluated if
	available.

From-SVN: r268112
This commit is contained in:
Jakub Jelinek 2019-01-21 12:55:52 +01:00 committed by Jakub Jelinek
parent d715f55431
commit 8f10fb5065
2 changed files with 20 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2019-01-21 Jakub Jelinek <jakub@redhat.com>
PR libstdc++/86590
* include/bits/char_traits.h (__constant_string_p,
__constant_char_array_p): Use __builtin_is_constant_evaluated if
available.
2019-01-20 Ulrich Drepper <drepper@redhat.com>
Implement C++20 P0600r1.

View File

@ -230,9 +230,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_string_p(const _CharT* __s)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
(void) __s;
// In constexpr contexts all strings should be constant.
return __builtin_is_constant_evaluated();
#else
while (__builtin_constant_p(*__s) && *__s)
__s++;
return __builtin_constant_p(*__s);
#endif
}
/**
@ -247,10 +253,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_char_array_p(const _CharT* __a, size_t __n)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
(void) __a;
(void) __n;
// In constexpr contexts all character arrays should be constant.
return __builtin_is_constant_evaluated();
#else
size_t __i = 0;
while (__builtin_constant_p(__a[__i]) && __i < __n)
__i++;
return __i == __n;
#endif
}
#endif