aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
AgeCommit message (Collapse)AuthorFilesLines
2018-10-16Fix tests that fail when compiled without optimisationJonathan Wakely4-1/+11
* testsuite/20_util/duration/literals/range_neg.cc: Adjust pruned diagnostic to account for quotes around 'constexpr'. * testsuite/23_containers/deque/capacity/max_size.cc: Define static variable. * testsuite/23_containers/vector/capacity/max_size.cc: Likewise. From-SVN: r265190
2018-10-16PR libstdc++/87618 fix typos in linker scriptJonathan Wakely4-4/+30
PR libstdc++/87618 * config/abi/pre/gnu.ver: Fix typos in patterns for basic_stringbuf. * testsuite/27_io/basic_stringbuf/cons/char/default.cc: Disable optimisation to check constructor definition can be linked to. * testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc: Likewise. From-SVN: r265188
2018-10-15Adjust test to pass with latest glibcJonathan Wakely2-2/+7
Glibc changed the it_IT locales to use thousands separators, invalidating this test. Use nl_NL instead, as Dutch only uses grouping for money not numbers. * testsuite/22_locale/numpunct/members/char/3.cc: Adjust test to account for change to glibc it_IT localedata (glibc bz#10797). From-SVN: r265165
2018-10-15PR libstdc++/87587 prevent -Wabi warningsJonathan Wakely2-0/+12
The warnings about changes to empty struct parameter passing can be ignored because the callers are all internal to the library, and so compiled with the same -fabi-version as the function definitions. It would be preferable to use #pragma GCC diagnostic warning "-Wabi=12" to get warnings about any other ABI changes in future versions, but until PR c++/87611 is fixed the warnings must be completely disabled with #pragma GCC diagnostic ignroed "-Wabi". PR libstdc++/87587 * src/c++11/cxx11-shim_facets.cc: Suppress -Wabi warnings. From-SVN: r265163
2018-10-15vector (vector<>::cbegin()): Use C++11 direct initialization.François Dumont2-10/+26
2018-10-15 François Dumont <fdumont@gcc.gnu.org> * include/debug/vector (vector<>::cbegin()): Use C++11 direct initialization. (vector<>::cend()): Likewise. (vector<>::emplace(const_iterator, _Args&&...)): Likewise and use consistent iterator comparison. (vector<>::insert(const_iterator, size_type, const _Tp&)): Likewise. (vector<>::insert(const_iterator, _InputIterator, _InputIterator)): Likewise. (vector<>::erase(const_iterator)): Likewise. (vector<>::erase(const_iterator, const_iterator)): Likewise. From-SVN: r265156
2018-10-12Initial commit of Networking TS implementationJonathan Wakely30-0/+10668
* include/Makefile.am: Add new headers. * include/Makefile.in: Regenerate. * include/experimental/bits/net.h: New header for common implementation details of Networking TS. * include/experimental/buffer: New header. * include/experimental/executor: New header. * include/experimental/internet: New header. * include/experimental/io_context: New header. * include/experimental/net: New header. * include/experimental/netfwd: New header. * include/experimental/socket: New header. * include/experimental/timer: New header. * testsuite/experimental/net/buffer/arithmetic.cc: New test. * testsuite/experimental/net/buffer/const.cc: New test. * testsuite/experimental/net/buffer/creation.cc: New test. * testsuite/experimental/net/buffer/mutable.cc: New test. * testsuite/experimental/net/buffer/size.cc: New test. * testsuite/experimental/net/buffer/traits.cc: New test. * testsuite/experimental/net/execution_context/use_service.cc: New test. * testsuite/experimental/net/headers.cc: New test. * testsuite/experimental/net/internet/address/v4/comparisons.cc: New test. * testsuite/experimental/net/internet/address/v4/cons.cc: New test. * testsuite/experimental/net/internet/address/v4/creation.cc: New test. * testsuite/experimental/net/internet/address/v4/members.cc: New test. * testsuite/experimental/net/internet/resolver/base.cc: New test. * testsuite/experimental/net/internet/resolver/ops/lookup.cc: New test. * testsuite/experimental/net/internet/resolver/ops/reverse.cc: New test. * testsuite/experimental/net/timer/waitable/cons.cc: New test. * testsuite/experimental/net/timer/waitable/dest.cc: New test. * testsuite/experimental/net/timer/waitable/ops.cc: New test. From-SVN: r265080
2018-10-12PR libstdc++/77691 increase allocation size to at least alignmentJonathan Wakely3-5/+23
It's not safe to assume that malloc(n) returns memory aligned to more than n, so when relying on the guaranteed alignment of malloc ensure that the number of bytes allocated is at least as large as the alignment. PR libstdc++/77691 * include/experimental/memory_resource (__resource_adaptor_imp): Do not allocate sizes smaller than alignment when relying on guaranteed alignment. * testsuite/experimental/memory_resource/new_delete_resource.cc: Adjust expected number of bytes allocated for alignof(max_align_t). From-SVN: r265068
2018-10-112018-10-11 François Dumont <fdumont@gcc.gnu.org>François Dumont2-20/+37
* include/debug/forward_list (forward_list<>::before_begin()): Use C++11 direct initialization. (forward_list<>::begin()): Likewise. (forward_list<>::end()): Likewise. (forward_list<>::cbefore_begin()): Likewise. (forward_list<>::cbegin()): Likewise. (forward_list<>::cend()): Likewise. (forward_list<>::emplace_after<>(const_iterator, _Args&&...)): Likewise. (forward_list<>::insert_after(const_iterator, const _Tp&)): Likewise. (forward_list<>::insert_after(const_iterator, _Tp&&)): Likewise. (forward_list<>::insert_after(const_iterator, size_type, const _Tp&)): Likewise. (forward_list<>::insert_after(const_iterator, initializer_list<>)): Likewise. (forward_list<>::erase_after(const_iterator)): Likewise. (forward_list<>::erase_after(const_iterator, const_iterator)): Likewise and ensure consistent iterator comparison. From-SVN: r265061
2018-10-112018-10-11 François Dumont <fdumont@gcc.gnu.org>François Dumont2-33/+44
* include/bits/forward_list.h (_Fwd_list_iterator<>::operator==): Replace member function with inline friend. (_Fwd_list_iterator<>::operator!=): Likewise. (_Fwd_list_const_iterator<>::operator==): Likewise. (_Fwd_list_const_iterator<>::operator!=): Likewise. (operator==(const _Fwd_list_iterator<>&, const _Fwd_list_const_iterator<>&)): Remove. (operator!=(const _Fwd_list_iterator<>&, const _Fwd_list_const_iterator<>&)): Remove. (forward_list<>::_Node): Take typedef from base type. (forward_list<>::iterator): Likewise. (forward_list<>::const_iterator): Likewise. From-SVN: r265060
2018-10-11PR libstdc++/80538 Only call sleep for non-zero valuesJonathan Wakely3-12/+48
Avoid a system call when no sleep is required. Sleep in a loop (actually two loops) to handle interruption by signals. PR libstdc++/80538 * src/c++11/thread.cc (this_thread::__sleep_for) [_GLIBCXX_HAVE_SLEEP]: Only call sleep for non-zero values. Loop while sleep call is interrupted and until steady_clock shows requested duration has elapsed. (!_GLIBCXX_HAVE_USLEEP]: Use the _GLIBCXX_HAVE_SLEEP code path, but avoiding the usleep call. * testsuite/30_threads/this_thread/60421.cc: Test repeated signal interruptions. From-SVN: r265044
2018-10-11Make ext allocators support heterogeneous equality comparisonJonathan Wakely9-40/+181
The Allocator requirements include the ability to compare different specializations of the same allocator class template. This did not work for __gnu_cxx::new_allocator and other extension allocators. This patch replaces the equality operators for those allocators with inline friends that support heterogeneous comparisons. (I'm not changing all ext allocators because some are bit-rotted already). Additionally, the equality operators for comparing two std::allocator objects of the same type are now defined as inline friends. Those overloads don't need to be declared at namespace scope, because they aren't specified in the standard (but they're needed in this implementation to avoid ambiguities caused by the extra overloads defined for the base allocator type). * include/bits/allocator.h (operator==(const allocator<_Tp>&, const allocator<_Tp>)) (operator!=(const allocator<_Tp>&, const allocator<_Tp>)): Replace with inline friends. * include/ext/debug_allocator.h (operator==, operator!=): Replace with inline friend functions that compare to rebound allocators. * include/ext/malloc_allocator.h (operator==, operator!=): Likewise. * include/ext/new_allocator.h (operator==, operator!=): Likewise. * testsuite/ext/debug_allocator/eq.cc: New test. * testsuite/ext/ext_pointer/alloc_eq.cc: New test. * testsuite/ext/malloc_allocator/eq.cc: New test. * testsuite/ext/new_allocator/eq.cc: New test. From-SVN: r265036
2018-10-10PR libstdc++/87544 limit max_size() to PTRDIFF_MAX / sizeof(T)Jonathan Wakely6-4/+105
The C++17 standard requires the default implementation for allocator_traits::max_size to return SIZE_MAX / sizeof(value_type). That causes GCC to warn because the value could be larger than can sensibly be passed to malloc. This patch changes the new_allocator and malloc_allocator max_size() members to use PTRDIFF_MAX instead of SIZE_MAX (and because they define it, the allocator_traits default isn't used). This also changes vector::max_size to impose a sensible limit using PTRDIFF_MAX for cases where the value from the allocator or allocator_traits is not sensible. PR libstdc++/87544 * include/bits/stl_vector.h (vector::_S_max_size): Limit size to PTRDIFF_MAX / sizeof(value_type). * include/ext/malloc_allocator.h (malloc_allocator::max_size): Likewise. * include/ext/new_allocator.h (new_allocator::max_size): Likewise. * testsuite/23_containers/vector/allocator/minimal.cc: Adjust expected value for max_size(). * testsuite/23_containers/vector/capacity/87544.cc: New test. From-SVN: r265021
2018-10-092018-10-09 François Dumont <fdumont@gcc.gnu.org>François Dumont2-24/+25
* include/bits/stl_list.h (_List_operator<>::operator==): Replace member function with inline friend. (_List_operator<>::operator!=): Likewise. (_List_const_operator<>::operator==): Likewise. (_List_const_operator<>::operator!=): Likewise. (operator==(const _List_iterator<>&, const _List_const_iterator<>&)): Remove. (operator!=(const _List_iterator<>&, const _List_const_iterator<>&)): Remove. From-SVN: r264993
2018-10-09Define std::string and related typedefs outside __cxx11 namespaceJonathan Wakely3-3/+12
The typedefs for common specializations of std::__cxx11::basic_string do not need to be in the std::__cxx11 namespace. Those typedefs are never used for linkage purposes so don't appear in mangled names, and so don't need to be distinct from the equivalent typedefs for the COW std::basic_string specializations. It is OK for the same typedef to refer to different types in different translation units. Defining them directly in namespace std improves diagnostics that use those typedefs. For example: error: could not convert '1' from 'int' to 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} will now be printed as: error: could not convert '1' from 'int' to 'std::string' {aka 'std::__cxx11::basic_string<char>'} The precise type is still shown, but the typedef is not obfuscated with the inline namespace. * include/bits/stringfwd.h (string, wstring, u16string, u32string): Define typedefs outside of __cxx11 inline namespace. * python/libstdcxx/v6/printers.py (register_type_printers): Also register printers for typedefs in new location. From-SVN: r264958
2018-10-08PR libstdc++/87538 Verify fix for std::experimental::not_fnJonathan Wakely2-0/+51
PR libstdc++/87538 * testsuite/experimental/functional/87538.cc: New test. From-SVN: r264922
2018-10-08PR libstdc++/87538 fix std::not_fn exception specificationsJonathan Wakely3-1/+58
PR libstdc++/87538 * include/std/functional (_Not_fn::operator()): Check value of __is_nothrow_invocable as well. * testsuite/20_util/function_objects/not_fn/87538.cc: New test. From-SVN: r264921
2018-10-08list (list<>::cbegin()): Use C++11 direct initialization.François Dumont2-18/+35
2018-10-08 François Dumont <fdumont@gcc.gnu.org> * include/debug/list (list<>::cbegin()): Use C++11 direct initialization. (list<>::cend()): Likewise. (list<>::emplace<>(const_iterator, _Args&&...)): Likewise. (list<>::insert(const_iterator, initializer_list<>)): Likewise. (list<>::insert(const_iterator, size_type, const _Tp&)): Likewise. (list<>::erase(const_iterator, const_iterator)): Ensure consistent iterator comparisons. (list<>::splice(const_iterator, list&&, const_iterator, const_iterator)): Likewise. From-SVN: r264911
2018-10-052018-10-05 François Dumont <fdumont@gcc.gnu.org>François Dumont6-75/+72
* include/bits/stl_tree.h (_Rb_tree_iterator<>::operator==): Make inline friend. (_Rb_tree_iterator<>::operator!=): Likewise. (_Rb_tree_const_iterator<>::operator==): Likewise. (_Rb_tree_const_iterator<>::operator!=): Likewise. (operator==(const _Rb_tree_iterator<>&, const _Rb_tree_const_iterator&)): Remove. (operator!=(const _Rb_tree_iterator<>&, const _Rb_tree_const_iterator&)): Remove. (operator==(const _Rb_tree<>&, const _Rb_tree<>&)): Make inline friend. (operator<(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise. (operator!=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise and deprecate. (operator>(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise. (operator<=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise. (operator>=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise. * include/debug/map.h (map<>::erase(const_iterator, const_iterator)): Compare __victim with _Base::cend(). * include/debug/multimap.h (multimap<>::erase(const_iterator, const_iterator)): Likewise. * include/debug/set.h (set<>::erase(const_iterator, const_iterator)): Compare __victim with _Base::cend(). * include/debug/multiset.h (multiset<>::erase(const_iterator, const_iterator)): Likewise. From-SVN: r264875
2018-10-03PR libstdc++/59439 optimize uses of classic ("C") std::localeJonathan Wakely3-9/+26
The global locale::_Impl that represents the "C" locale is never destroyed, so there is no need to keep track of reference count updates for that object. This greatly reduce contention between threads that refer to the classic locale. Since the global std::locale initially uses the classic locale, this benefits the common case for any code using the global locale, such as construction/destruction of iostream objects. All these updates are done inside libstdc++.so so there's no need to worry about users' objects having inlined old versions of the code which still update the reference count for the classic locale. PR libstdc++/59439 * src/c++98/locale.cc (locale::locale(const locale&)): Bypass reference count updates for the classic locale. (locale::~locale()): Likewise. (locale::operator=(const locale&)): Likewise. * src/c++98/locale_init.cc (locale::locale()): Likewise. (locale::global(const locale&)): Likewise. From-SVN: r264811
2018-10-032018-10-03 François Dumont <fdumont@gcc.gnu.org>François Dumont5-75/+132
* include/debug/map.h (map<>::emplace<>(_Args&&...)): Use C++11 direct initialization. (map<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise. (map<>::insert(value_type&&)): Likewise. (map<>::insert<>(_Pair&&)): Likewise. (map<>::insert<>(const_iterator, _Pair&&)): Likewise. (map<>::try_emplace): Likewise. (map<>::insert_or_assign): Likewise. (map<>::insert(node_type&&)): Likewise. (map<>::insert(const_iterator, node_type&&)): Likewise. (map<>::erase(const_iterator)): Likewise. (map<>::erase(const_iterator, const_iterator)): Likewise. * include/debug/multimap.h (multimap<>::emplace<>(_Args&&...)): Use C++11 direct initialization. (multimap<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise. (multimap<>::insert<>(_Pair&&)): Likewise. (multimap<>::insert<>(const_iterator, _Pair&&)): Likewise. (multimap<>::insert(node_type&&)): Likewise. (multimap<>::insert(const_iterator, node_type&&)): Likewise. (multimap<>::erase(const_iterator)): Likewise. (multimap<>::erase(const_iterator, const_iterator)): Likewise. * include/debug/set.h (set<>::emplace<>(_Args&&...)): Use C++11 direct initialization. (set<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise. (set<>::insert(value_type&&)): Likewise. (set<>::insert<>(const_iterator, value_type&&)): Likewise. (set<>::insert(const_iterator, node_type&&)): Likewise. (set<>::erase(const_iterator)): Likewise. (set<>::erase(const_iterator, const_iterator)): Likewise. * include/debug/multiset.h (multiset<>::emplace<>(_Args&&...)): Use C++11 direct initialization. (multiset<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise. (multiset<>::insert<>(value_type&&)): Likewise. (multiset<>::insert<>(const_iterator, value_type&&)): Likewise. (multiset<>::insert(node_type&&)): Likewise. (multiset<>::insert(const_iterator, node_type&&)): Likewise. (multiset<>::erase(const_iterator)): Likewise. (multiset<>::erase(const_iterator, const_iterator)): Likewise. From-SVN: r264805
2018-10-02vector<bool> _M_start and 0 offsetMarc Glisse2-3/+9
2018-10-02 Marc Glisse <marc.glisse@inria.fr> PR libstdc++/87258 * include/bits/stl_bvector.h (vector::begin(), vector::cbegin()): Rebuild _M_start with an explicit 0 offset. From-SVN: r264791
2018-10-02Avoid redundant runtime checks in std::visitJonathan Wakely2-18/+23
Calling std::get will check some static assertions and also do a runtime check for a valid index before calling __detail::__variant::__get. The std::visit function already handles the case where any variant has an invalid index, so __get can be used directly in __visit_invoke. * include/std/variant (__gen_vtable_impl::__visit_invoke): Call __get directly instead of get, as caller ensures correct index is used. (holds_alternative, get, get_if): Remove redundant inline specifiers. (_VARIANT_RELATION_FUNCTION_TEMPLATE): Likewise. From-SVN: r264786
2018-10-02Use -fno-show-column in libstdc++ installed testing.Joseph Myers2-1/+6
<https://gcc.gnu.org/ml/libstdc++/2016-08/msg00006.html> arranged for libstdc++ tests to use -fno-show-column by default, but only for build-tree testing. This patch adds it to the options used for installed testing as well. Tested with installed testing for a cross to x86_64-linux-gnu, where it fixes various test failures. * testsuite/lib/libstdc++.exp (libstdc++_init): Use -fno-show-column in default cxxflags. From-SVN: r264784
2018-10-02config: Remove unused define for os uClibcBernhard Reutner-Fischer2-4/+5
__NO_STRING_INLINES was removed from uClibc around 2004 so has no effect. libstdc++-v3/ChangeLog: 2018-10-01 Bernhard Reutner-Fischer <aldot@gcc.gnu.org> * config/os/uclibc/os_defines.h (__NO_STRING_INLINES): Delete. From-SVN: r264783
2018-10-01allocator.xml: Adjust link to "Reconsidering Custom Memory Allocation".Gerald Pfeifer2-1/+6
* doc/xml/manual/allocator.xml: Adjust link to "Reconsidering Custom Memory Allocation". From-SVN: r264761
2018-10-01Regenerate libstdc++ HTML pagesJonathan Wakely9-11/+15
* doc/html/*: Regenerate. From-SVN: r264760
2018-09-30messages.xml: Switch link to www.oracle.com to https.Gerald Pfeifer2-1/+6
* doc/xml/manual/messages.xml: Switch link to www.oracle.com to https. From-SVN: r264723
2018-09-30policy_data_structures_biblio.xml: Update link to Microsoft Component Model ↵Gerald Pfeifer2-1/+6
Object Technologies. * doc/xml/manual/policy_data_structures_biblio.xml: Update link to Microsoft Component Model Object Technologies. From-SVN: r264722
2018-09-29fdl-1.3.xml: The Free Software Foundation web site now uses https.Gerald Pfeifer3-2/+8
* doc/xml/gnu/fdl-1.3.xml: The Free Software Foundation web site now uses https. Also omit the unnecessary trailing slash. * doc/xml/gnu/gpl-3.0.xml: Ditto. From-SVN: r264710
2018-09-28functions.h (__foreign_iterator_aux3(const _Safe_iterator<>&, const ↵François Dumont2-1/+8
_InputeIter&, const _InputIter&, __true_type)): Use empty() rather than begin() == end(). 2018-09-28 François Dumont <fdumont@gcc.gnu.org> * include/debug/functions.h (__foreign_iterator_aux3(const _Safe_iterator<>&, const _InputeIter&, const _InputIter&, __true_type)): Use empty() rather than begin() == end(). From-SVN: r264699
2018-09-25Use steady_clock to implement condition_variable::wait_for with predicateMike Crowe2-2/+8
In r263225 (d2e378182a12d68fe5caeffae681252662a2fe7b), I fixed condition_variable::wait_for to use std::chrono::steady_clock for the wait. Unfortunately, I failed to spot that the same fix is required for the wait_for variant that takes a predicate too. 2018-09-25 Mike Crowe <mac@mcrowe.com> * include/std/condition_variable (condition_variable::wait_for): Use steady clock in overload that uses a predicate. From-SVN: r264575
2018-09-25PR libstdc++/87431 optimise valueless_by_exception()Jonathan Wakely2-0/+9
If a std::variant can never get into valueless state then we don't need to do a runtime check for a valid alternative. PR libstdc++/87431 * include/std/variant (_Variant_storage<true, _Types...>::_M_valid): Avoid runtime test when all alternatives are scalars and so cannot throw during initialization. From-SVN: r264574
2018-09-24codecvt.xml: Move link to "UTF-8 and Unicode FAQ" to https.Gerald Pfeifer2-1/+6
* doc/xml/manual/codecvt.xml: Move link to "UTF-8 and Unicode FAQ" to https. From-SVN: r264547
2018-09-24policy_data_structures_biblio.xml: Update link to "Priority Queues and the STL".Gerald Pfeifer2-1/+6
* doc/xml/manual/policy_data_structures_biblio.xml: Update link to "Priority Queues and the STL". From-SVN: r264527
2018-09-23using_exceptions.xml: Move boost.orgs link to https.Gerald Pfeifer2-2/+7
* doc/xml/manual/using_exceptions.xml: Move boost.orgs link to https. From-SVN: r264515
2018-09-21re PR libstdc++/87135 ([C++17] unordered containers violate iterator ↵François Dumont4-8/+19
validity requirements) 2018-09-21 François Dumont <fdumont@gcc.gnu.org> PR libstdc++/87135 * src/c++11/hashtable_c++0x.cc (_Prime_rehash_policy::_M_next_bkt): Use __builtin_floor to compute _M_next_resize. * testsuite/23_containers/unordered_set/hash_policy/71181.cc: Adapt. * testsuite/23_containers/unordered_set/hash_policy/prime_rehash.cc: Adapt. From-SVN: r264494
2018-09-21Un-split hypot<long double> testsJonathan Wakely3-30/+11
Remove the hypot-long-double.cc file that used dg-xfail-run-if and simply use the lower tolerance for double if long double is not larger than double. * testsuite/26_numerics/headers/cmath/hypot-long-double.cc: Remove. * testsuite/26_numerics/headers/cmath/hypot.cc: Restore test for long double unconditionally, but use lower tolerance when sizeof(long double) == sizeof(double). From-SVN: r264483
2018-09-20hypot-long-double.cc: Skip on arm*.Christophe Lyon2-1/+6
2018-09-20 Christophe Lyon <christophe.lyon@linaro.org> * testsuite/26_numerics/headers/cmath/hypot-long-double.cc: Skip on arm*. From-SVN: r264443
2018-09-19Don't use __glibcxx_assert to check class invariantsJonathan Wakely2-10/+9
Assertions should be used to check preconditions that users must meet, not to check whether the implementation is correct. * include/bits/regex_automaton.tcc (_StateSeq<_TraitsT>::_M_clone()): Remove __glibcxx_assert statements and use map::find instead of map::operator[]. From-SVN: r264422
2018-09-18re PR libstdc++/87135 ([C++17] unordered containers violate iterator ↵François Dumont3-14/+48
validity requirements) 2018-09-18 François Dumont <fdumont@gcc.gnu.org> PR libstdc++/87135 * src/c++11/hashtable_c++0x.cc: (_Prime_rehash_policy::_M_next_bkt): Return a prime no smaller than requested size, but not necessarily greater. (_Prime_rehash_policy::_M_need_rehash): Rehash only if target size is strictly greater than next resize threshold. * testsuite/23_containers/unordered_map/modifiers/reserve.cc: Adapt test to validate that there is no rehash as long as number of insertion is lower or equal to the reserved number of elements. From-SVN: r264413
2018-09-18Fix location of invocable check for unique_ptr deleterJonathan Wakely3-4/+48
The deleter only needs to be invocable when the unique_ptr destructor and reset member function are instantiated. In other contexts it might not be possible to pass unique_ptr<T, D>::pointer to the deleter, if that requires a derived-to-base conversion from T* and T is incomplete. * include/bits/unique_ptr.h (__uniq_ptr_impl): Remove static assertion checking invocable condition. (unique_ptr::~unique_ptr, unique_ptr::reset): Restore static assertion here, where types must be complete. Pass pointer to deleter as an rvalue. * testsuite/20_util/unique_ptr/requirements/incomplete.cc: New test. From-SVN: r264399
2018-09-13Limit workaround for Clang bug to __clang_major__ <= 7Jonathan Wakely2-1/+6
The bug https://bugs.llvm.org/show_bug.cgi?id=33222 is now fixed on Clang trunk, so the workaround won't be needed for Clang 8.0 and later. * include/std/variant (variant) [__clang__]: Limit workaround to Clang 7 and older. From-SVN: r264271
2018-09-11PR libstdc++/87278 restore support for std::make_shared<volatile T>()Jonathan Wakely3-1/+32
PR libstdc++/87278 * include/bits/shared_ptr.h (make_shared): Use remove_cv instead of remove_const. * testsuite/20_util/shared_ptr/creation/87278.cc: New test. From-SVN: r264207
2018-09-11Implement LWG 2905 changes to constrain unique_ptr constructorsJonathan Wakely6-42/+160
LWG DR 2905 says that is_constructible_v<unique_ptr<P, D>, P, D const &> should be false when D is not copy constructible. This commit implements the changes from the DR and simplifies the signatures as per https://github.com/cplusplus/draft/issues/1530 * include/bits/unique_ptr.h (__uniq_ptr_impl): Add assertions to check deleter type. (unique_ptr::unique_ptr(pointer, const deleter_type&)): Add copy constructible constraint. (unique_ptr::unique_ptr(pointer, deleter_type&&)): Disable for deleters of reference type and add move constructible constraint. (unique_ptr::unique_ptr(pointer, remove_reference_t<deleter_type>&&)): Disable for deleters of non-reference type. Define as deleted. (unique_ptr<T[], D>): Likewise. * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Replace dg-error directives with unstable line numbers with dg-prune-output. * testsuite/20_util/unique_ptr/cons/cv_qual_neg.cc: Likewise. * testsuite/20_util/unique_ptr/cons/lwg2905.cc: New test. * testsuite/20_util/unique_ptr/specialized_algorithms/swap_cxx17.cc: Make deleter types invocable. From-SVN: r264206
2018-09-05* libsupc++/cxxabi.h (__cxa_demangle): Clarify doxygen comment.Jonathan Wakely2-2/+7
From-SVN: r264127
2018-09-03PR libstdc++/78179 run long double tests separatelyJonathan Wakely3-1/+35
Split the long double testing into a separate file, so that we can XFAIL targets where the long double precision doesn't meet the expected tolerances. The float and double tests are still expefted to PASS for all targets. PR libstdc++/78179 * testsuite/26_numerics/headers/cmath/hypot-long-double.cc: New test that runs the long double part of hypot.cc. * testsuite/26_numerics/headers/cmath/hypot.cc: Disable long double tests unless TEST_HYPOT_LONG_DOUBLE is defined. From-SVN: r264063
2018-09-03Fix vector::_Temporary_value::_M_ptrJonathan Wakely2-3/+7
The pointer argument to allocator_traits::construct and allocator_traits::destroy should be a raw pointer, not the allocator's pointer type. _Temporary_value::_M_ptr was returning the wrong type. * include/bits/stl_vector.h (vector::_Temporary_value::_M_ptr): Return raw pointer not allocator's pointer type. (vector::_Temporary_value::_M_val): Use _M_ptr. From-SVN: r264061
2018-09-03PR libstdc++/87194 fix range insertion into maps and setsJonathan Wakely10-50/+306
Since C++11 range insertion and construction of maps and sets from a pair of iterators only requires that the iterator's value_type is convertible to the container's value_type (previously it had to be the same). This fixes the implementation to meet that relaxed requirement, by defining a pair of overloads that either insert or emplace, depending on the iterator's value_type. Instead of adding yet another overload of _M_insert_unique and _M_insert_equal, the overloads taking iterators are renamed to _M_insert_range_unique and _M_insert_range_equal. PR libstdc++/87194 * include/bits/stl_map.h (map::map(initializer_list<value_type>, const Compare&, const Alloc&)) (map::map(initializer_list<value_type>, const Alloc&)) (map::map(InputIterator, InputIterator, const Alloc&)) (map::map(InputIterator, InputIterator)) (map::map(InputIterator, InputIterator, const Compare&, const Alloc&)) (map::insert(InputIterator, InputIterator)): Call _M_insert_range_unique instead of _M_insert_unique. * include/bits/stl_multimap.h (multimap::multimap(initializer_list<value_type>, const C&, const A&)) (multimap::multimap(initializer_list<value_type>, const A&)) (multimap::multimap(InputIterator, InputIterator, const A&)) (multimap::multimap(InputIterator, InputIterator)) (multimap::multimap(InputIterator, InputIterator, const C&, const A&)) (multimap::insert(InputIterator, InputIterator)): Call _M_insert_range_equal instead of _M_insert_equal. * include/bits/stl_multiset.h (multiset::multiset(InputIterator, InputIterator)) (multiset::multiset(InputIterator, InputIterator, const C&, const A&)) (multiset::multiset(initializer_list<value_type>, const C&, const A&)) (multiset::multiset(initializer_list<value_type>, const A&)) (multiset::multiset(InputIterator, InputIterator, const A&)) (multiset::insert(InputIterator, InputIterator)): Call _M_insert_range_equal instead of _M_insert_equal. * include/bits/stl_set.h (set::set(InputIterator, InputIterator)) (set::set(InputIterator, InputIterator, const Compare&, const Alloc&)) (set::set(initializer_list<value_type>, const Compare&, const Alloc&)) (set::set(initializer_list<value_type>, const Alloc&)) (set::set(InputIterator, InputIterator, const Alloc&)) (set::insert(InputIterator, InputIterator)): Call _M_insert_range_unique instead of _M_insert_unique. * include/bits/stl_tree.h [__cplusplus >= 201103L] (_Rb_tree::__same_value_type): New alias template for SFINAE constraints. [__cplusplus >= 201103L] (_Rb_tree::_M_insert_range_unique): Pair of constrained overloads that either insert or emplace, depending on iterator's value_type. [__cplusplus >= 201103L] (_Rb_tree::_M_insert_range_equal): Likewise. [__cplusplus < 201103L] (_Rb_tree::_M_insert_range_unique) (_Rb_tree::_M_insert_range_equal): New functions replacing range versions of _M_insert_unique and _M_insert_equal. (_Rb_tree::_M_insert_unique(_InputIterator, _InputIterator)) (_Rb_tree::_M_insert_equal(_InputIterator, _InputIterator)): Remove. * testsuite/23_containers/map/modifiers/insert/87194.cc: New test. * testsuite/23_containers/multimap/modifiers/insert/87194.cc: New test. * testsuite/23_containers/multiset/modifiers/insert/87194.cc: New test. * testsuite/23_containers/set/modifiers/insert/87194.cc: New test. From-SVN: r264060
2018-09-03PR libstdc++/78595 implement insertion into maps in terms of emplaceJonathan Wakely8-42/+523
C++14 simplified the specification of the generic insert function templates to be equivalent to calling emplace (or emplace_hint). Defining them in terms of emplace takes care of the problems described in PR 78595, ensuring a single conversion to value_type is done at the right time. PR libstdc++/78595 * include/bits/stl_map.h (map::insert(_Pair&&)) (map::insert(const_iterator, _Pair&&)): Do emplace instead of insert. * include/bits/stl_multimap.h (multimap::insert(_Pair&&)) (multimap::insert(const_iterator, _Pair&&)): Likewise. * include/bits/unordered_map.h (unordered_map::insert(_Pair&&)) (unordered_map::insert(const_iterator, _Pair&&)) (unordered_multimap::insert(_Pair&&)) (unordered_multimap::insert(const_iterator, _Pair&&)): Likewise. * testsuite/23_containers/map/modifiers/insert/78595.cc: New test. * testsuite/23_containers/multimap/modifiers/insert/78595.cc: New test. * testsuite/23_containers/unordered_map/modifiers/78595.cc: New test. * testsuite/23_containers/unordered_multimap/modifiers/78595.cc: New test. From-SVN: r264059
2018-09-022018-09-02 François Dumont <fdumont@gcc.gnu.org>François Dumont7-384/+429
* include/debug/safe_iterator.h (_Safe_iterator<_It, _Seq, _Cat>::_Self): New. (_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>::_Self): New. (_Safe_iterator<_It, _Seq, std::random_access_iterator_tag> ::_OtherSelf): New. (_GLIBCXX_DEBUG_VERIFY_OPERANDS, _GLIBCXX_DEBUG_VERIFY_EQ_OPERANDS) (_GLIBCXX_DEBUG_VERIFY_REL_OPERANDS) (_GLIBCXX_DEBUG_VERIFY_DIST_OPERANDS): Define macros. (_Safe_iterator<_It, _Seq, std::random_access_iterator_tag> ::operator+(difference_type)): Use latters, inline as friend. (_Safe_iterator<_It, _Seq, std::random_access_iterator_tag> ::operator-(difference_type)): Likewise. (operator==(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator!=(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator<(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator<=(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator>(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator>=(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator-(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator+(difference_type, const _Safe_iterator<>&)): Likewise. (operator-(const _Safe_iterator<>&, difference_type)): Likewise. * include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_can_advance(difference_type)): Take parameter by copy. * include/debug/safe_local_iterator.h (_Safe_local_iterator<_It, _Seq>::_Self): New. (_Safe_local_iterator<_It, _Seq>::_OtherSelf): New. (_GLIBCXX_DEBUG_VERIFY_OPERANDS): Define macro. (operator==(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&)): Use latter, inline as friend. (operator!=(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&)): Likewise. * testsuite/util/testsuite_containers.h: Include utility. (struct forward_members_unordered<_Tp, bool>): Remove 2nd template parameter. (forward_members_unordered<>::forward_members_unordered(value_type&)): Add using namespace std::rel_ops. Add iterator_concept_checks on local_iterator and const_local_iterator. Add asserts on comparison between const_local_iterator and local_iterator. (struct forward_members_unordered<_Tp, false>): Remove partial specialization. * testsuite/23_containers/forward_list/types/1.cc: New. * testsuite/23_containers/list/types/1.cc: New. From-SVN: r264039