diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-01-24 15:39:25 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-01-24 15:39:25 +0000 |
commit | e658669fe18d27bbde85085d648f0392f3f9bce6 (patch) | |
tree | eddfdc9e4eb573f87f18f3b2ca3d2c5ed4443a5f | |
parent | 400a08e28429f2c56c2298908be673a5951d5e20 (diff) | |
download | gcc-e658669fe18d27bbde85085d648f0392f3f9bce6.zip gcc-e658669fe18d27bbde85085d648f0392f3f9bce6.tar.gz gcc-e658669fe18d27bbde85085d648f0392f3f9bce6.tar.bz2 |
PR libstdc++/88840 delay evaluation of constant until type is complete
Clang fails to compile std::vector<Incomplete> because the static member
__use_relocate cannot be evaluated for an incomplete type. Replace with
a static member function that will not be odr-used until needed, by
which point the type must be complete.
PR libstdc++/88840
* include/bits/stl_vector.h (vector::__use_relocate): Replace static
data member with static member function _S_use_relocate().
* include/bits/vector.tcc (vector::reserve, vector::_M_realloc_insert)
(vector::_M_default_append): Use _S_use_relocate() instead of
__use_relocate.
From-SVN: r268239
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_vector.h | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/vector.tcc | 8 |
3 files changed, 19 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index dd27078..7a1deca 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2019-01-24 Jonathan Wakely <jwakely@redhat.com> + PR libstdc++/88840 + * include/bits/stl_vector.h (vector::__use_relocate): Replace static + data member with static member function _S_use_relocate(). + * include/bits/vector.tcc (vector::reserve, vector::_M_realloc_insert) + (vector::_M_default_append): Use _S_use_relocate() instead of + __use_relocate. + * testsuite/27_io/filesystem/path/compare/strings.cc: Only compare sign of results. diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 54de0e0..43debda 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -424,11 +424,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER private: #if __cplusplus >= 201103L - static constexpr bool __use_relocate = - noexcept(std::__relocate_a(std::declval<pointer>(), - std::declval<pointer>(), - std::declval<pointer>(), - std::declval<_Tp_alloc_type&>())); + static constexpr bool + _S_use_relocate() + { + return noexcept(std::__relocate_a(std::declval<pointer>(), + std::declval<pointer>(), + std::declval<pointer>(), + std::declval<_Tp_alloc_type&>())); + } #endif protected: diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index edd0b6a..4cf0e80 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER const size_type __old_size = size(); pointer __tmp; #if __cplusplus >= 201103L - if constexpr (__use_relocate) + if constexpr (_S_use_relocate()) { __tmp = this->_M_allocate(__n); std::__relocate_a(this->_M_impl._M_start, @@ -457,7 +457,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __new_finish = pointer(); #if __cplusplus >= 201103L - if constexpr (__use_relocate) + if constexpr (_S_use_relocate()) { __new_finish = std::__relocate_a @@ -498,7 +498,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER __throw_exception_again; } #if __cplusplus >= 201103L - if constexpr (!__use_relocate) + if constexpr (!_S_use_relocate()) #endif std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator()); _GLIBCXX_ASAN_ANNOTATE_REINIT; @@ -639,7 +639,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_check_len(__n, "vector::_M_default_append"); pointer __new_start(this->_M_allocate(__len)); #if __cplusplus >= 201103L - if constexpr (__use_relocate) + if constexpr (_S_use_relocate()) { __try { |