diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-01-21 12:55:52 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-01-21 12:55:52 +0100 |
commit | 8f10fb5065db28760123a21cc8645cf4865d3ff8 (patch) | |
tree | 9680c5928ab70232b27daf88976b86eb45b285d5 | |
parent | d715f5543117af088e6d8099806b266aa2dac047 (diff) | |
download | gcc-8f10fb5065db28760123a21cc8645cf4865d3ff8.zip gcc-8f10fb5065db28760123a21cc8645cf4865d3ff8.tar.gz gcc-8f10fb5065db28760123a21cc8645cf4865d3ff8.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/char_traits.h | 13 |
2 files changed, 20 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cb7f1a6..483f195 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h index 06e04ce..d91fe84 100644 --- a/libstdc++-v3/include/bits/char_traits.h +++ b/libstdc++-v3/include/bits/char_traits.h @@ -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 |