From e658669fe18d27bbde85085d648f0392f3f9bce6 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 24 Jan 2019 15:39:25 +0000 Subject: [PATCH] PR libstdc++/88840 delay evaluation of constant until type is complete Clang fails to compile std::vector 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 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/include/bits/stl_vector.h | 13 ++++++++----- 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 dd270781a6c..7a1deca18cb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2019-01-24 Jonathan Wakely + 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 54de0e09ce7..43debda54f1 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(), - std::declval(), - std::declval(), - std::declval<_Tp_alloc_type&>())); + static constexpr bool + _S_use_relocate() + { + return noexcept(std::__relocate_a(std::declval(), + std::declval(), + std::declval(), + std::declval<_Tp_alloc_type&>())); + } #endif protected: diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index edd0b6aeaa8..4cf0e809fe9 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 { -- 2.30.2