Commit 8f10fb50 by Jakub Jelinek Committed by Jakub Jelinek

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

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
parent d715f554
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> 2019-01-20 Ulrich Drepper <drepper@redhat.com>
Implement C++20 P0600r1. Implement C++20 P0600r1.
......
...@@ -230,9 +230,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -230,9 +230,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static _GLIBCXX_ALWAYS_INLINE constexpr bool static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_string_p(const _CharT* __s) __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) while (__builtin_constant_p(*__s) && *__s)
__s++; __s++;
return __builtin_constant_p(*__s); return __builtin_constant_p(*__s);
#endif
} }
/** /**
...@@ -247,10 +253,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -247,10 +253,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static _GLIBCXX_ALWAYS_INLINE constexpr bool static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_char_array_p(const _CharT* __a, size_t __n) __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; size_t __i = 0;
while (__builtin_constant_p(__a[__i]) && __i < __n) while (__builtin_constant_p(__a[__i]) && __i < __n)
__i++; __i++;
return __i == __n; return __i == __n;
#endif
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment