aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/src
AgeCommit message (Collapse)AuthorFilesLines
2018-10-03PR libstdc++/59439 optimize uses of classic ("C") std::localeJonathan Wakely2-9/+16
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-09-21re PR libstdc++/87135 ([C++17] unordered containers violate iterator ↵François Dumont1-2/+2
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-18re PR libstdc++/87135 ([C++17] unordered containers violate iterator ↵François Dumont1-6/+5
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-08-28PR libstdc++/87116 fix path::lexically_normal() handling of dot-dotJonathan Wakely1-4/+15
Previously the logic that turned "a/b/c/../.." into "a/" failed to preserve an empty path at the end of the iteration sequence, as required by the trailing slash. That meant the result didn't meet the class invariants, and that "a/b/c/d/../../.." would remove four components instead of the three that "../../.." should remove. PR libstdc++/87116 * src/filesystem/std-path.cc (path::lexically_normal): When handling a dot-dot filename, preserve an empty final component in the iteration sequence. [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Use preferred-separator for root-directory. * testsuite/27_io/filesystem/path/generation/normal.cc: Add new tests for more than two adjacent dot-dot filenames. [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Replace slashes with preferred-separator in expected normalized strings. From-SVN: r263922
2018-08-16Fix bootstrap with --enable-fully-dynamic-stringJonathan Wakely1-0/+20
PR libstdc++/86447 * src/c++11/cow-stdexcept.cc [_GLIBCXX_FULLY_DYNAMIC_STRING] (logic_error::logic_error(logic_error&&)) (logic_error::operator=(logic_error&&)) (runtime_error::runtime_error(runtime_error&&)) (runtime_error::operator=(runtime_error&&)): Copy strings instead of moving, to avoid allocating empty reps for moved-from strings. From-SVN: r263590
2018-08-15Fix single-threaded build for targets without atomicsJonathan Wakely1-1/+21
* src/c++17/memory_resource.cc [!_GLIBCXX_HAS_GTHREADS] (atomic_mem_res): Add unsynchronized definition for single-threaded. From-SVN: r263554
2018-08-14PR libstdc++/86846 Alternative to pointer-width atomicsJonathan Wakely2-1/+51
Define a class using std::mutex for when std::atomic<memory_resource*> cannot be used to implement the default memory resource. When std::mutex constructor is not constexpr the constant_init trick won't work, so just define a global and use init_priority for it. The compiler warns about using reserved priority, so put the definition in a header file using #pragma GCC system_header to suppress the warning. PR libstdc++/86846 * src/c++17/default_resource.h: New file, defining default_res. * src/c++17/memory_resource.cc [ATOMIC_POINTER_LOCK_FREE != 2] (atomic_mem_res): Define alternative for atomic<memory_resource*> using a mutex instead of atomics. From-SVN: r263536
2018-08-14PR libstdc++/85343 overload __throw_ios_failure to take errnoJonathan Wakely2-1/+17
[ios::failure] p2: "When throwing ios_base::failure exceptions, implementations should provide values of ec that identify the specific reason for the failure." This adds a new overload of __throw_ios_failure that can be passed errno, to store error_code(errno, system_category()) in the exception object. PR libstdc++/85343 * acinclude.m4 (libtool_VERSION): Bump version. * config/abi/pre/gnu.ver (GLIBCXX_3.4.26): Add new symbol version. Export new symbol. * configure: Regenerate. * doc/xml/manual/abi.xml: Document new versions. * include/bits/fstream.tcc (basic_filebuf<C, T>::underflow) (basic_filebuf<C, T>::xsgetn): Pass errno to __throw_ios_failure. * include/bits/functexcept.h (__throw_ios_failure(const char*, int)): Declare new overload. * src/c++11/cxx11-ios_failure.cc (__ios_failure): Add new constructor and static member function. (__throw_ios_failure(const char*, int)): Define. * src/c++98/ios_failure.cc [!_GLIBCXX_USE_DUAL_ABI] (__throw_ios_failure(const char*, int)): Define. * testsuite/util/testsuite_abi.cc: Update known and latest versions. From-SVN: r263535
2018-08-07Define monotonic_buffer_resource members out-of-lineJonathan Wakely1-0/+83
Move the allocation logic into libstdc++.so so that it can be changed without worrying about inlined code in existing binaries. Leave do_allocate inline so that calls to it can be devirtualized, and only the slow path needs to call into the library. * config/abi/pre/gnu.ver: Export monotonic_buffer_resource members. * include/std/memory_resource (monotonic_buffer_resource::release): Call _M_release_buffers to free buffers. (monotonic_buffer_resource::do_allocate): Call _M_new_buffer to allocate a new buffer from upstream. (monotonic_buffer_resource::_M_new_buffer): Declare. (monotonic_buffer_resource::_M_release_buffers): Declare. (monotonic_buffer_resource::_Chunk): Replace definition with declaration as opaque type. * src/c++17/memory_resource.cc (monotonic_buffer_resource::_Chunk): Define. (monotonic_buffer_resource::_M_new_buffer): Define. (monotonic_buffer_resource::_M_release_buffers): Define. From-SVN: r263354
2018-08-03Add workaround for non-unique errno values on AIXJonathan Wakely1-1/+2
* src/c++11/system_error.cc (system_error_category::default_error_condition): Add workaround for ENOTEMPTY and EEXIST having the same value on AIX. * testsuite/19_diagnostics/error_category/system_category.cc: Add extra testcases for EDOM, EILSEQ, ERANGE, EEXIST and ENOTEMPTY. From-SVN: r263289
2018-08-01Add -D_GLIBCXX_ASSERTIONS to DEBUG_FLAGSJonathan Wakely1-3/+3
Enable assertions in the extra debug library built when --enable-libstdcxx-debug is used. Replace some Debug Mode assertions in src/c++11/futex.cc with __glibcxx_assert, because the library will never be built with Debug Mode. * configure: Regenerate. * configure.ac: Add -D_GLIBCXX_ASSERTIONS to default DEBUG_FLAGS. * src/c++11/futex.cc: Use __glibcxx_assert instead of _GLIBCXX_DEBUG_ASSERT. From-SVN: r263235
2018-08-01PR libstdc++/60555 std::system_category() should recognise POSIX errno valuesJonathan Wakely1-0/+255
PR libstdc++/60555 * src/c++11/system_error.cc (system_error_category::default_error_condition): New override to check for POSIX errno values. * testsuite/19_diagnostics/error_category/generic_category.cc: New * testsuite/19_diagnostics/error_category/system_category.cc: New test. From-SVN: r263210
2018-07-26* src/c++98/locale_init.cc: Fix #ifdef condition.Marek Polacek1-1/+1
From-SVN: r263016
2018-07-26Add missing checks for _GLIBCXX_USE_C99_STDINT_TR1Jonathan Wakely1-0/+2
The throw_allocator extension depends on <tr1/random> which depends on _GLIBCXX_USE_C99_STDINT_TR1. The Transactional Memory support uses fixed-width integer types from <stdint.h>. * include/ext/throw_allocator.h [!_GLIBCXX_USE_C99_STDINT_TR1] (random_condition, throw_value_random, throw_allocator_random) (std::hash<throw_value_random>): Do not define when <tr1/random> is not usable. * src/c++11/cow-stdexcept.cc [!_GLIBCXX_USE_C99_STDINT_TR1]: Do not define transactional memory support when <stdint.h> is not usable. From-SVN: r263004
2018-07-26Remove char16_t and char32_t dependency on <stdint.h>Jonathan Wakely3-7/+3
The char16_t and char32_t types are automatically defined by the compiler and do not depend on support in <stdint.h>. The char_traits specializations depend on uint_leastNN_t but can be made to work anyway by using the predefined macros, or as a last resort make_unsigned. * include/bits/basic_string.h [!_GLIBCXX_USE_C99_STDINT_TR1] (hash<u16string>, hash<u32string>): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. * include/bits/char_traits.h [!_GLIBCXX_USE_C99_STDINT_TR1] (char_traits<char16_t>, char_traits<char32_t>): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. Use __UINT_LEAST16_TYPE__ and __UINT_LEAST32_TYPE__ or make_unsigned when <stdint.h> is not usable. * include/bits/codecvt.h [!_GLIBCXX_USE_C99_STDINT_TR1] (codecvt<char16_t, char, mbstate_t>) (codecvt<char32_t, char, mbstate_t>) (codecvt_byname<char16_t, char, mbstate_t>) (codecvt_byname<char32_t, char, mbstate_t>): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. * include/bits/locale_facets.h [!_GLIBCXX_USE_C99_STDINT_TR1] (_GLIBCXX_NUM_UNICODE_FACETS): Likewise. * include/bits/stringfwd.h [!_GLIBCXX_USE_C99_STDINT_TR1] (char_traits<char16_t>, char_traits<char32_t>) (basic_string<char16_t>, basic_string<char32_t>): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. * include/experimental/string_view [!_GLIBCXX_USE_C99_STDINT_TR1] (u16string_view, u32string_view, hash<u16string_view>) (hash<u32string_view>, operator""sv(const char16_t, size_t)) (operator""sv(const char32_t, size_t)): Likewise. * include/ext/vstring.h [!_GLIBCXX_USE_C99_STDINT_TR1] (hash<__u16vstring>, hash<__u32vstring>): Likewise. * include/ext/vstring_fwd.h [!_GLIBCXX_USE_C99_STDINT_TR1] (__u16vstring, __u16sso_string, __u16rc_string, __u32vstring) (__u32sso_string, __u32rc_string): Likewise. * include/std/codecvt [!_GLIBCXX_USE_C99_STDINT_TR1] (codecvt_mode) (codecvt_utf8, codecvt_utf16, codecvt_utf8_utf16): Likewise. * include/std/string_view [!_GLIBCXX_USE_C99_STDINT_TR1] (u16string_view, u32string_view, hash<u16string_view>) (hash<u32string_view>, operator""sv(const char16_t, size_t)) (operator""sv(const char32_t, size_t)): Likewise. * src/c++11/codecvt.cc: Likewise. * src/c++98/locale_init.cc: Likewise. * src/c++98/localename.cc: Likewise. From-SVN: r263002
2018-07-26Remove <chrono> dependency on _GLIBCXX_USE_C99_STDINT_TR1Jonathan Wakely6-15/+11
By adding fallback definitions of std::intmax_t and std::uintmax_t it's possible to define <ratio> without _GLIBCXX_USE_C99_STDINT_TR1. This in turn allows most of <chrono> to be defined, which removes the dependency on _GLIBCXX_USE_C99_STDINT_TR1 for all of the C++11 concurrency features. The compiler defines __INTMAX_TYPE__ and __UINTMAX_TYPE__ unconditionally so it should be safe to rely on them. * include/bits/atomic_futex.h [!_GLIBCXX_USE_C99_STDINT_TR1] (__atomic_futex_unsigned_base): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1 macro. * include/bits/unique_lock.h [!_GLIBCXX_USE_C99_STDINT_TR1] (unique_lock): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. * include/c_global/cstdint [!_GLIBCXX_USE_C99_STDINT_TR1] (intmax_t) (uintmax_t): Define using predefined macros. * include/std/chrono [!_GLIBCXX_USE_C99_STDINT_TR1] (duration) (time_point, system_clock, high_resolution_clock, steady_clock): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1 macro. (nanoseconds, microseconds, milliseconds, seconds, minutes, hours): [!_GLIBCXX_USE_C99_STDINT_TR1]: Define using __INT64_TYPE__ or long long when <stdint.h> is not usable. * include/std/condition_variable [!_GLIBCXX_USE_C99_STDINT_TR1] (condition_variable, condition_variable_any): Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1. * include/std/future [!_GLIBCXX_USE_C99_STDINT_TR1] (future, promise) (packaged_task, async): Likewise. * include/std/mutex [!_GLIBCXX_USE_C99_STDINT_TR1] (recursive_mutex) (timed_mutex, recursive_timed_mutex, try_lock, lock, scoped_lock) (once_flag, call_once): Likewise. * include/std/ratio [!_GLIBCXX_USE_C99_STDINT_TR1] (ratio): Likewise. * include/std/shared_mutex [!_GLIBCXX_USE_C99_STDINT_TR1] (shared_mutex, shared_timed_mutex, shared_lock): Likewise. * include/std/thread [!_GLIBCXX_USE_C99_STDINT_TR1] (thread) (this_thread::get_id, this_thread::yield, this_thread::sleep_for) (this_thread::sleep_until): Likewise. * src/c++11/chrono.cc: Remove dependency on _GLIBCXX_USE_C99_STDINT_TR1 macro. * src/c++11/condition_variable.cc: Likewise. * src/c++11/futex.cc: Likewise. * src/c++11/future.cc: Likewise. * src/c++11/mutex.cc: Likewise. * src/c++11/thread.cc: Likewise. * testsuite/20_util/duration/literals/range_neg.cc: Adjust dg-error. * testsuite/20_util/duration/requirements/typedefs_neg1.cc: Likewise. * testsuite/20_util/duration/requirements/typedefs_neg2.cc: Likewise. * testsuite/20_util/duration/requirements/typedefs_neg3.cc: Likewise. * testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Likewise. * testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Likewise. From-SVN: r263001
2018-07-25Add new src/c++17 directory to list in acinclude.m4Jonathan Wakely2-2/+2
* acinclude.m4 (glibcxx_SUBDIRS): Add src/c++17. * src/Makefile.am: Add comment. * src/c++17/Makefile.in: Regenerate. From-SVN: r262964
2018-07-24Add initial version of C++17 <memory_resource> headerJonathan Wakely6-12/+894
This is missing the synchronized_pool_resource and unsynchronized_pool_resource classes but is otherwise complete. This is a new implementation, not based on the existing code in <experimental/memory_resource>, but memory_resource and polymorphic_allocator ended up looking almost the same anyway. The constant_init kluge in src/c++17/memory_resource.cc is apparently due to Richard Smith and ensures that the objects are constructed during constant initialiation phase and not destroyed (because the constant_init destructor doesn't destroy the union member and the storage is not reused). * config/abi/pre/gnu.ver: Export new symbols. * configure: Regenerate. * include/Makefile.am: Add new <memory_resource> header. * include/Makefile.in: Regenerate. * include/precompiled/stdc++.h: Include <memory_resource> for C++17. * include/std/memory_resource: New header. (memory_resource, polymorphic_allocator, new_delete_resource) (null_memory_resource, set_default_resource, get_default_resource) (pool_options, monotonic_buffer_resource): Define. * src/Makefile.am: Add c++17 directory. * src/Makefile.in: Regenerate. * src/c++11/Makefile.am: Fix comment. * src/c++17/Makefile.am: Add makefile for new sub-directory. * src/c++17/Makefile.in: Generate. * src/c++17/memory_resource.cc: New. (newdel_res_t, null_res_t, constant_init, newdel_res, null_res) (default_res, new_delete_resource, null_memory_resource) (set_default_resource, get_default_resource): Define. * testsuite/20_util/memory_resource/1.cc: New test. * testsuite/20_util/memory_resource/2.cc: New test. * testsuite/20_util/monotonic_buffer_resource/1.cc: New test. * testsuite/20_util/monotonic_buffer_resource/allocate.cc: New test. * testsuite/20_util/monotonic_buffer_resource/deallocate.cc: New test. * testsuite/20_util/monotonic_buffer_resource/release.cc: New test. * testsuite/20_util/monotonic_buffer_resource/upstream_resource.cc: New test. * testsuite/20_util/polymorphic_allocator/1.cc: New test. * testsuite/20_util/polymorphic_allocator/resource.cc: New test. * testsuite/20_util/polymorphic_allocator/select.cc: New test. * testsuite/util/testsuite_allocator.h (__gnu_test::memory_resource): Define concrete memory resource for testing. (__gnu_test::default_resource_mgr): Define RAII helper for changing default resource. From-SVN: r262953
2018-07-17PR libstdc++/86450 use -Wabi=2 and simplify -Werror useJonathan Wakely5-8/+9
Use -Wabi=2 to fix warnings about -Wabi having no effect on its own. This requires suppressing two warnings in src/c++11/debug.cc which do not affect the library ABI. Previously libstdc++ defaulted to --enable-werror but the -Werror flag was not actually added unless --enable-maintainer-mode was used. This is not documented and not the expected behaviour. This removes any special treatment for maintainer-mode, makes -Werror depend directly on --enable-werror, and changes the default to --enable-werror=no. PR libstdc++/86450 * acinclude.m4 (GLIBCXX_CHECK_COMPILER_FEATURES): Don't define WERROR. (GLIBCXX_EXPORT_FLAGS): Use -Wabi=2 instead of -Wabi. * configure: Regenerate. * configure.ac: Change GLIBCXX_ENABLE_WERROR default to "no". * doc/Makefile.in: Regenerate. * fragment.am: Set WERROR_FLAG to -Werror instead of $(WERROR). * include/Makefile.in: Regenerate. * libsupc++/Makefile.in: Regenerate. * po/Makefile.in: Regenerate. * python/Makefile.in: Regenerate. * src/Makefile.in: Regenerate. * src/c++11/Makefile.in: Regenerate. * src/c++11/debug.cc: Use diagnostic pragmas to suppress warnings from -Wabi=2 that don't affect exported symbols. * src/c++98/Makefile.in: Regenerate. * src/filesystem/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. From-SVN: r262824
2018-07-17Remove unused explicit instantiation of __bind_simpleJonathan Wakely1-79/+3
The explicit instantiation of std::call_once used to require an instantiation of __bind_simple, but call_once was changed by r241031 to not use __bind_simple. The instantiation of __bind_simple (and the definitions it uses) are not needed. They should have been removed instead of doing the changes in r241111 that kept them compiling. The use of std::call_once by _Async_state_common::_M_join can be simplified to use a pointer instead of reference wrapper. The call_once symbol isn't exported so the change isn't visible outside the library. * src/c++11/compatibility-thread-c++0x.cc [_GLIBCXX_SHARED] (_Async_state_common::_M_join): Simplify use of std::call_once and corresponding explicit instantiation. (_Maybe_wrap_member_pointer, _Bind_simple, _Bind_simple_helper) (__bind_simple): Remove definitions and explicit instantiation that are not required by exported symbols. From-SVN: r262823
2018-07-05PR libstdc++/85831 define move constructors and operators for exceptionsJonathan Wakely1-1/+14
PR libstdc++/85831 * config/abi/pre/gnu.ver: Export move constructors and move assignment operators for std::logic_error and std::runtime_error. * include/std/stdexcept: Use _GLIBCXX_NOTHROW instead of _GLIBCXX_USE_NOEXCEPT. (logic_error, runtime_error): Declare move constructors and move assignment operators. When not declared already, define copy constructors and copy assignment operators as explicit-defaulted. (domain_error, invalid_argument, length_error, out_of_range) (overflow_error, underflow_error): Define move constructors and move assignment operators as explicitly-defaulted. * libsupc++/exception.h (exception): Likewise. * src/c++11/cow-stdexcept.cc (logic_error, runtime_error): Define move constructors and move assignment operators as defaulted. * testsuite/19_diagnostics/stdexcept.cc: Check that constructors and assignment operators are defined. From-SVN: r262456
2018-06-21PR libstdc++/83328 add correct basic_string::insert for initializer_listJonathan Wakely1-0/+2
The SSO basic_string has a non-standard insert(iterator, initializer_list) overload, from a C++0x draft. This adds the correct overload, while also preserving the old one so that the old symbol is still exported from the library. The COW basic_string doesn't have any of the C++11 changes to the insert overloads (they all still have non-const iterator parameters and the ones that should return an iterator still return void). This doesn't make any change to the COW string. PR libstdc++/83328 * acinclude.m4 (libtool_VERSION): Bump to 6:26:0. * config/abi/pre/gnu.ver: Add GLIBCXX_3.4.26 and export new symbol. * configure: Regenerate. * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] (basic_string::insert(const_iterator, initializer_list<C>)): Add. [_GLIBCXX_USE_CXX11_ABI && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS] (basic_string::insert(iterator, initializer_list<C>)): Suppress definition. * include/debug/string (basic_string::insert(iterator, C)): Change first parameter to const_iterator. (basic_string::insert(iterator, size_type, C)): Likewise. Change return type to iterator. (basic_string::insert(iterator, InputIterator, InputIterator)): Likewise. (basic_string::insert(iterator, initializer_list<C>)): Change first parameter to const_iterator and return type to iterator. * src/c++11/string-inst.cc: Extend comment. * testsuite/21_strings/basic_string/modifiers/insert/char/83328.cc: New. * testsuite/21_strings/basic_string/modifiers/insert/wchar_t/83328.cc: New. * testsuite/util/testsuite_abi.cc: Add new symbol version. From-SVN: r261866
2018-06-16LWG 3076 basic_string CTAD ambiguityJonathan Wakely1-0/+6
When deduction guides are supported by the compiler (i.e. for C++17 and later) replace two basic_string constructors by constrained function templates as required by LWG 3075. In order to ensure that the pre-C++17 non-template constructors are still exported from the shared library define a macro in src/c++11/string-inst.cc to force the non-template declarations (this isn't strictly needed yet, because the string instantiations are compiled with -std=gnu++11, but that is likely to change). LWG 3076 basic_string CTAD ambiguity * doc/xml/manual/intro.xml: Document LWG 3076 change. * include/bits/basic_string.h [__cpp_deduction_guides && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS] (basic_string(const _CharT*, const _Alloc&)): Turn into a function template constrained by _RequireAllocator. (basic_string(size_type, _CharT, const _Alloc&)): Likewise. * src/c++11/string-inst.cc (_GLIBCXX_DEFINING_STRING_INSTANTIATIONS): Define. * testsuite/21_strings/basic_string/cons/char/deduction.cc: Test deduction * testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc: Likewise. From-SVN: r261670
2018-06-072018-06-07 François Dumont <fdumont@gcc.gnu.org>François Dumont1-12/+16
* src/c++11/debug.cc (_Safe_iterator_base::_M_detach()): Reset state only if needed. (_Safe_iterator_base::_M_detach_single()): Likewise. (_Safe_local_iterator_base::_M_detach()): Reset state only if needed. (_Safe_local_iterator_base::_M_detach_single()): Likewise. From-SVN: r261262
2018-05-31PR libstdc++/78870 support std::filesystem on WindowsJonathan Wakely8-184/+497
PR libstdc++/78870 support std::filesystem on Windows * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Check for link, readlink and symlink. * include/bits/fs_path.h (path::operator/=(const path&)): Move definition out of class body. (path::is_absolute(), path::_M_append(path)): Likewise. (operator<<(basic_ostream, const path&)): Use std::quoted directly. (operator>>(basic_istream, path&)): Likewise. (u8path): Reorder definitions and fix Windows implementation. (path::is_absolute()): Define inline and fix for Windows. [!_GLIBCXX_FILESYSTEM_IS_WINDOWS] (path::operator/=(const path&)): Define POSIX version inline. (path::_M_append(path)): Define inline. * include/experimental/bits/fs_path.h (path::is_absolute()): Move definition out of class body. (operator<<(basic_ostream, const path&)): Fix type of delimiter and escape characters. (operator>>(basic_istream, path&)): Likewise. (path::is_absolute()): Define inline and fix for Windows. * src/filesystem/dir-common.h (__gnu_posix): New namespace. (__gnu_posix::char_type, __gnu_posix::DIR, __gnu_posix::dirent) (__gnu_posix::opendir, __gnu_posix::readdir, __gnu_posix::closedir): Define as adaptors for Windows functions/types or as using-declarations for POSIX functions/types. (_Dir_base, get_file_type): Qualify names to use declarations from __gnu_posix namespace. (_Dir_base::is_dor_or_dotdot): New helper functions. * src/filesystem/dir.cc (_Dir, recursive_directory_iterator): Qualify names to use declarations from __gnu_posix namespace. * src/filesystem/ops-common.h (__gnu_posix): New nested namespace. (__gnu_posix::open, __gnu_posix::close, __gnu_posix::stat_type) (__gnu_posix::stat, __gnu_posix::lstat, __gnu_posix::mode_t) (__gnu_posix::chmod, __gnu_posix::mkdir, __gnu_posix::getcwd) (__gnu_posix::chdir, __gnu_posix::utimbuf, __gnu_posix::utime) (__gnu_posix::rename, __gnu_posix::truncate, __gnu_posix::char_type): Define as adaptors for Windows functions/types or as using-declarations for POSIX functions/types. (stat_type, do_copy_file): Qualify names to use declarations from __gnu_posix namespace. (do_space): Declare new function. (make_file_type): Only use S_ISLNK if defined. * src/filesystem/ops.cc (char_ptr, filesystem::canonical): Use path::value_type not char. (filesystem::copy, create_dir, filesystem::create_directory): Qualify names to use declarations from __gnu_posix namespace. (filesystem::create_hard_link): Check HAVE_LINK autoconf macro and add implementation for Windows. (filesystem::create_symlink): Check HAVE_SYMLINK autoconf macro. (filesystem::current_path(error_code&)): Use __gnu_posix::getcwd. [!_PC_PATH_MAX]: Don't use pathconf. [PATH_MAX]: Use if defined. (filesystem::current_path(const path&, error_code&)) (filesystem::equivalent, do_stat, filesystem::hard_link_count) (filesystem::last_write_time, filesystem::permissions): Use names from __gnu_posix. (filesystem::read_symlink): Check HAVE_READLINK autoconf macro. (filesystem::remove) [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Add implementation for Windows. (filesystem::rename, filesystem::resize_file): Use names from __gnu_posix. (filesystem::space): Use do_space. [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Get absolute path to directory. (filesystem::status, filesystem::symlink_status): Use names from __gnu_posix. (filesystem::temp_directory_path): Add implementation for Windows. * src/filesystem/path.cc (dot): Define constant. (path::replace_extension): Use dot. (path::_M_find_extension): Likewise. Use path::string_type not std::string. (path::_M_split_cmpts): Use dot. (filesystem_error::_M_get_what): Use u8string() not native(). * src/filesystem/std-dir.cc (_Dir, recursive_directory_iterator): Qualify names to use declarations from __gnu_posix namespace. * src/filesystem/std-ops.cc (filesystem::absolute(const path&)): Use correct error_code. (filesystem::absolute(const path&, error_code&)): Add implementation for Windows. (char_ptr, filesystem::canonical): Use path::value_type not char. (do_copy_file): Use names from __gnu_posix. [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Do not use fchmod, fchmodat or sendfile. (filesystem::copy, create_dir, filesystem::create_directory): Qualify names to use declarations from __gnu_posix namespace. (filesystem::create_hard_link): Check HAVE_LINK autoconf macro and add implementation for Windows. (filesystem::create_symlink): Check HAVE_SYMLINK autoconf macro. (filesystem::current_path(error_code&)): Use __gnu_posix::getcwd. [!_PC_PATH_MAX]: Don't use pathconf. [PATH_MAX]: Use if defined. (filesystem::current_path(const path&, error_code&)) (filesystem::equivalent, do_stat, filesystem::hard_link_count) (filesystem::last_write_time, filesystem::permissions): Use names from __gnu_posix. (filesystem::read_symlink): Check HAVE_READLINK autoconf macro. (filesystem::remove) [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Add implementation for Windows. (filesystem::rename, filesystem::resize_file): Use names from __gnu_posix. (do_space): Define. (filesystem::space): Use do_space. (filesystem::status, filesystem::symlink_status): Use names from __gnu_posix. (filesystem::temp_directory_path): Add implementation for Windows. * src/filesystem/std-path.cc [_GLIBCXX_FILESYSTEM_IS_WINDOWS] (path::operator/=(const path&)): Define for Windows. (dot): Define constant. (path::replace_extension, is_dot): Use dot. (path::lexically_normal): Check _M_type instead of calling non-existent function. (path::_M_find_extension): Use dot. Use path::string_type not std::string. (path::_M_split_cmpts): Use dot. (filesystem_error::_M_get_what): Use u8string() not native(). * testsuite/27_io/filesystem/iterators/directory_iterator.cc: Do not use symlinks. * testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc: Likewise. * testsuite/27_io/filesystem/operations/absolute.cc: Use __gnu_test::root_path() instead of "/" and add Windows-specific tests. * testsuite/27_io/filesystem/operations/canonical.cc: Use path::string() to get narrow string, not path::native(). * testsuite/27_io/filesystem/operations/copy.cc: Construct fstreams with std::filesystem::path not std::basic_string. * testsuite/27_io/filesystem/operations/copy_file.cc: Likewise. * testsuite/27_io/filesystem/operations/exists.cc: Use __gnu_test::root_path() instead of "/". * testsuite/27_io/filesystem/operations/is_empty.cc: Construct fstreams with std::filesystem::path not std::basic_string. * testsuite/27_io/filesystem/operations/last_write_time.cc: Use path::string() to get narrow string. * testsuite/27_io/filesystem/operations/space.cc: Check results for errors, expect sensible values otherwise. * testsuite/27_io/filesystem/operations/temp_directory_path.cc: Add helpers for adjusting the environment on Windows. * testsuite/27_io/filesystem/path/append/path.cc: Test Windows-specific behaviour. * testsuite/27_io/filesystem/path/construct/format.cc: Fix creation of path::string_type objects. * testsuite/27_io/filesystem/path/construct/locale.cc: Compare native string to wide string on Windows. * testsuite/27_io/filesystem/path/decompose/root_directory.cc: Allow for backslash as root-directory. * testsuite/27_io/filesystem/path/decompose/stem.cc: Use path::string() to get narrow string. * testsuite/27_io/filesystem/path/itr/traversal.cc: Test Windows-style paths. * testsuite/27_io/filesystem/path/native/string.cc: Use string_type not std::string. * testsuite/27_io/filesystem/path/query/is_absolute.cc: Adjust for different definintion of absolute paths on Windows. * testsuite/experimental/filesystem/iterators/directory_iterator.cc: Do not use symlinks. * testsuite/experimental/filesystem/operations/absolute.cc: Test Windows behaviour. * testsuite/experimental/filesystem/operations/copy.cc: Construct fstreams with NTCTS not std::basic_string. * testsuite/experimental/filesystem/operations/copy_file.cc: Likewise. * testsuite/experimental/filesystem/operations/exists.cc: Use __gnu_test::root_path() instead of "/". * testsuite/experimental/filesystem/operations/is_empty.cc: Construct fstreams with NTCTS not std::basic_string. * testsuite/experimental/filesystem/operations/last_write_time.cc: Use path::string() to get narrow string. * testsuite/experimental/filesystem/operations/space.cc: Use __gnu_test::root_path() instead of "/". * testsuite/experimental/filesystem/operations/temp_directory_path.cc: Add helpers for adjusting the environment on Windows. * testsuite/experimental/filesystem/path/append/path.cc: Use path::string() to get narrow strings for comparisons. * testsuite/experimental/filesystem/path/concat/path.cc: Likewise. * testsuite/experimental/filesystem/path/decompose/root_directory.cc: Likewise. * testsuite/experimental/filesystem/path/decompose/stem.cc: Likewise. * testsuite/experimental/filesystem/path/native/string.cc: Use string_type not std::string. * testsuite/experimental/filesystem/path/query/is_absolute.cc: Adjust for different definintion of absolute paths on Windows. * testsuite/util/testsuite_fs.h (__gnu_test::root_path()): New function. (__gnu_test::scoped_file): Construct fstreams with NTCTS not std::basic_string. From-SVN: r261034
2018-05-25re PR libstdc++/85768 (FreeBSD bootstrap fails due to undefined reference to ↵François Dumont1-2/+4
'backtrace') 2018-05-25 François Dumont <fdumont@gcc.gnu.org> PR libstdc++/85768 * src/c++11/debug.cc: Remove backtrace usage. From-SVN: r260761
2018-05-23Fix handling of an empty filename at end of a pathJonathan Wakely1-9/+8
The C++17 std::filesystem::path grammar allows an empty filename as the last component (to signify a trailing slash). The existing code does not handle this consistently, sometimes an empty filename has type _Multi and sometimes it has type _Filename. This can result in a non-empty iterator range for an empty filename component. This change ensures that empty paths always have type _Filename and will yield an empty iterator range. * include/bits/fs_path.h (path::_M_type): Change default member initializer to _Filename. (path::begin): Create past-the-end iterator for empty path. * src/filesystem/std-path.cc (path::remove_filename()): Remove debugging check. (path::has_relative_path()): Return false for empty filenames. (path::_M_split_cmpts): Set _M_type to _Filename for empty paths. Fix offset of empty final component. * testsuite/27_io/filesystem/path/itr/components.cc: New. * testsuite/27_io/filesystem/path/itr/traversal.cc: Add new inputs. From-SVN: r260616
2018-05-21Fix std::filesystem::absolute for empty pathsJonathan Wakely1-4/+12
* src/filesystem/std-ops.cc (absolute): Report an error for empty paths. (weakly_canonical(const path&)): Do not call canonical on empty path. (weakly_canonical(const path&, error_code&)): Likewise. * testsuite/27_io/filesystem/operations/absolute.cc: Check for errors. From-SVN: r260441
2018-05-21PR libstdc++/85843 fix "should be explicitly initialized" warningsJonathan Wakely1-2/+2
PR libstdc++/85843 * src/c++11/cow-stdexcept.cc (logic_error, runtime_error): Explicitly initialize base class to avoid warnings. From-SVN: r260427
2018-05-19Fix std::codecvt_utf8<wchar_t> for MingwJonathan Wakely1-1/+6
* src/c++11/codecvt.cc (__codecvt_utf8_base<wchar_t>::do_in) [__SIZEOF_WCHAR_T__==2 && __BYTE_ORDER__!=__ORDER_BIG_ENDIAN__]: Set little_endian element in bitmask. * testsuite/22_locale/codecvt/codecvt_utf8/69703.cc: Run all tests. * testsuite/22_locale/codecvt/codecvt_utf8/wchar_t/1.cc: New. From-SVN: r260389
2018-05-17PR libstdc++/85818 ensure path::preferred_separator is definedJonathan Wakely1-1/+1
Because path.cc is compiled with -std=gnu++17 the static constexpr data member is implicitly 'inline' and so no definition gets emitted unless it gets used in that translation unit. Other translation units built as C++11 or C++14 still require a namespace-scope definition of the variable, so mark the definition as used. PR libstdc++/85818 * src/filesystem/path.cc (path::preferred_separator): Add used attribute. * testsuite/experimental/filesystem/path/preferred_separator.cc: New. From-SVN: r260326
2018-05-09safe_iterator.h (_Safe_iterator<>::_M_constant()): Rename in...François Dumont1-1/+4
2018-05-09 François Dumont <fdumont@gcc.gnu.org> * include/debug/safe_iterator.h (_Safe_iterator<>::_M_constant()): Rename in... (_Safe_iterator<>::_S_constant()): ...that. * include/debug/safe_local_iterator.h (_Safe_local_iterator<>::_M_constant()): Rename in... (_Safe_local_iterator<>::_S_constant()): ...that. * include/debug/formatter.h: Remove bits/cpp_type_traits.h include. (_Iterator_state::__rbegin): New. (_Iterator_state::__rmiddle): New. (_Iterator_state::__rend): New. (_Parameter::_Parameter(const _Safe_iterator<>&, const char*, _Is_iterator)): Use _Safe_iterator<>::_S_constant. Grab normal underlying iterator type. (_Parameter::_Parameter(const _Safe_local_iterator<>&, const char*, _Is_iterator)): Likewise. (_Parameter::_S_reverse_state(_Iterator_state)): New. (_Parameter(__gnu_cxx::__normal_iterator<> const&, const char*, _Is_iterator)): New. (_Parameter(std::reverse_iterator<> const&, const char*, _Is_iterator)): New. (_Parameter(std::reverse_iterator<_Safe_iterator<>> const&, const char*, _Is_iterator)): New. (_Parameter(std::move_iterator<> const&, const char*, _Is_iterator): New. (_Parameter(std::move_iterator<_Safe_iterator<>> const&, const char*, _Is_iterator)): New. * testsuite/24_iterators/move_iterator/debug_neg.cc: New. * testsuite/24_iterators/normal_iterator/debug_neg.cc: New. * testsuite/24_iterators/reverse_iterator/debug_neg.cc: New. From-SVN: r260093
2018-05-08debug.cc [...]: Include execinfo.h.François Dumont1-0/+27
2018-05-08 François Dumont <fdumont@gcc.gnu.org> * src/c++11/debug.cc [_GLIBCXX_HAVE_EXECINFO_H]: Include execinfo.h. [_GLIBCXX_HAVE_EXECINFO_H](_Error_formatter::_M_error): Render backtrace. From-SVN: r260054
2018-05-08formatter.h (_Error_formatter::_M_function): New.François Dumont1-2/+11
2018-05-08 François Dumont <fdumont@gcc.gnu.org> * include/debug/formatter.h (_Error_formatter::_M_function): New. (_Error_formatter(const char*, unsigned int)): Adapt. (_Error_formatter::_M_at): Rename in... (_Error_formatter::_S_at): ...that and adapt. * include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY_AT_F): New. (_GLIBCXX_DEBUG_VERIFY_AT, _GLIBCXX_DEBUG_VERIFY): Adapt. * src/c++11/debug.cc (_Error_formatter::_M_error): Render _M_function when available. From-SVN: r260052
2018-05-03PR libstdc++/85632 fix wraparound in filesystem::spaceJonathan Wakely2-6/+8
On 32-bit targets any values over 4GB would wrap and produce the wrong result. PR libstdc++/85632 use uintmax_t for arithmetic * src/filesystem/ops.cc (experimental::filesystem::space): Perform arithmetic in result type. * src/filesystem/std-ops.cc (filesystem::space): Likewise. * testsuite/27_io/filesystem/operations/space.cc: Check total capacity is greater than free space. * testsuite/experimental/filesystem/operations/space.cc: New. From-SVN: r259901
2018-05-02PR libstdc++/68197 fail on negative iword/pword indicesJonathan Wakely1-33/+26
The suggested resolution of LWG 3083 is to make invalid indices undefined, but we can fairly easily check for them and treat them as errors in the same way as allocation failure. This avoids a segfault or worse, setting an error flag on the stream instead. PR libstdc++/68197 * include/bits/ios_base.h (ios_base::iword, ios_base::pword): Cast indices to unsigned. * src/c++11/ios.cc (ios_base::_M_grow_words): Treat negative indices as failure. Refactor error handling. * testsuite/27_io/ios_base/storage/68197.cc: New. From-SVN: r259854
2018-04-18PR libstdc++/85442 fix duplicate debuginfo for cxx11-ios_failure.ccJonathan Wakely2-4/+4
2018-04-18 Jonathan Wakely <jwakely@redhat.com> Jakub Jelinek <jakub@redhat.com> PR libstdc++/85442 * src/c++11/Makefile.am: Don't generate debuginfo again for cxx11-ios_failure-lt.s and cxx11-ios_failure.s files. * src/c++11/Makefile.in: Regenerate. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r259467
2018-04-13Fix broken sed command from previous commitJonathan Wakely2-2/+2
* src/c++11/Makefile.am: Fix sed command. * src/c++11/Makefile.in: Regenerate. From-SVN: r259374
2018-04-13Fix __iosfail_type_info hack to work on darwinJonathan Wakely2-9/+2
* src/c++11/Makefile.am: Rewrite sed rule to be less fragile and to handle mangled names starting with double underscores on darwin. * src/c++11/Makefile.in: Regenerate. From-SVN: r259371
2018-04-12Fix comments that misspell names of files and classesJonathan Wakely4-5/+5
* src/c++11/Makefile.am: Fix comment. * src/c++11/Makefile.in: Regenerate. * src/c++11/cxx11-ios_failure.cc: Fix comment. * src/c++98/ios_failure.cc: Likewise. From-SVN: r259357
2018-04-12Remove #define made redundant by r259281Jonathan Wakely1-4/+0
The definition of __throw_ios_failure is no longer in this file, so setting the macro here is unnecessary. * src/c++11/ios.cc: Remove redundant macro definition. From-SVN: r259349
2018-04-10PR libstdc++/85222 allow catching iostream errors as gcc4-compatible ↵Jonathan Wakely5-12/+162
ios::failure Define a new exception type derived from std::ios::failure[abi:cxx11] which also aggregates an object of the gcc4-compatible ios::failure type. Make __throw_ios_failure throw this new type for iostream errors that raise exceptions. Provide custom type info for the new type so that it can be caught by handlers for the gcc4-compatible ios::failure type as well as handlers for ios::failure[abi:cxx11] and its bases. PR libstdc++/85222 * src/c++11/Makefile.am [ENABLE_DUAL_ABI]: Add special rules for cxx11-ios_failure.cc to rewrite type info for __ios_failure. * src/c++11/Makefile.in: Regenerate. * src/c++11/cxx11-ios_failure.cc (__ios_failure, __iosfail_type_info): New types. [_GLIBCXX_USE_DUAL_ABI] (__throw_ios_failure): Define here. * src/c++11/ios.cc (__throw_ios_failure): Remove definition. * src/c++98/ios_failure.cc (__construct_ios_failure) (__destroy_ios_failure, is_ios_failure_handler): New functions. [!_GLIBCXX_USE_DUAL_ABI] (__throw_ios_failure): Define here. * testsuite/27_io/ios_base/failure/dual_abi.cc: New. * testsuite/27_io/basic_ios/copyfmt/char/1.cc: Revert changes to handler types, to always catch std::ios_base::failure. * testsuite/27_io/basic_ios/exceptions/char/1.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/char/ exceptions_failbit.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/ exceptions_failbit.cc: Likewise. * testsuite/27_io/basic_istream/extractors_other/char/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_istream/extractors_other/wchar_t/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_istream/sentry/char/12297.cc: Likewise. * testsuite/27_io/basic_istream/sentry/wchar_t/12297.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/char/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/wchar_t/ exceptions_null.cc: Likewise. * testsuite/27_io/ios_base/storage/2.cc: Likewise. From-SVN: r259281
2018-03-09Use non-throwing is_directory in filesystem::create_directoryJonathan Wakely2-6/+2
The create_dir helper was calling the throwing form of filesystem::is_directory instead of passing the error_code argument. Since std::filesystem::create_directory(const path&, error_code&) is noexcept, it would call std::terminate if an error occurred in is_directory. Passing the error_code also takes care of clearing it in the case where is_directory returns true. src/filesystem/ops.cc (create_dir): Pass error_code to is_directory. src/filesystem/std-ops.cc (create_dir): Likewise. From-SVN: r258375
2018-01-18configure.ac (AC_CHECK_HEADERS): Add linux/types.h.Uros Bizjak1-0/+4
* configure.ac (AC_CHECK_HEADERS): Add linux/types.h. Conditionally include linux/types.h when checking linux/random.h header. * config.h.in: Regenerate. * configure: Ditto. * src/c++11/random.cc: Conditionally include linux/types.h. From-SVN: r256859
2018-01-05PR libstdc++/83626 simplify filesystem::remove and filesystem::remove_allJonathan Wakely2-31/+5
PR libstdc++/83626 * src/filesystem/ops.cc (remove(const path&, error_code&)): Remove unnecessary symlink_status call. (remove_all(const path&, error_code&)): Use filesystem::remove. * src/filesystem/std-ops.cc: Likewise. From-SVN: r256301
2018-01-05PR libstdc++/83279 Use non-null offset argument for sendfileJonathan Wakely1-18/+15
PR libstdc++/83279 * src/filesystem/std-ops.cc (do_copy_file): Use non-null offset with sendfile. From-SVN: r256289
2018-01-05PR libstdc++/83626 handle ENOENT due to filesystem raceJonathan Wakely2-22/+56
PR libstdc++/83626 * src/filesystem/ops.cc (remove(const path&, error_code&)): Do not report an error for ENOENT. (remove_all(const path&)): Fix type of result variable. (remove_all(const path&, error_code&)): Use non-throwing increment for directory iterator. Call POSIX remove directly to avoid redundant calls to symlink_status. Do not report errors for ENOENT. * src/filesystem/std-ops.cc: Likewise. * testsuite/27_io/filesystem/operations/remove_all.cc: Test throwing overload. * testsuite/experimental/filesystem/operations/remove_all.cc: Likewise. From-SVN: r256283
2018-01-04PR libstdc++/83626 Don't throw for remove("") and remove_all("")Jonathan Wakely2-28/+46
PR libstdc++/83626 * src/filesystem/ops.cc (remove(const path&, error_code&))): Remove redundant call to ec.clear(). (remove_all(const path&, error_code&))): Do not return an error for non-existent paths. * src/filesystem/std-ops.cc: Likewise. * testsuite/27_io/filesystem/operations/remove.cc: New test. * testsuite/27_io/filesystem/operations/remove_all.cc: Fix expected results for non-existent paths. * testsuite/experimental/filesystem/operations/remove.cc: New test. * testsuite/experimental/filesystem/operations/remove_all.cc: Fix expected results for non-existent paths. From-SVN: r256269
2018-01-03Update copyright years.Jakub Jelinek116-116/+116
From-SVN: r256169
2017-12-14PR libstdc++/83279 handle sendfile not copying entire fileJonathan Wakely1-22/+45
PR libstdc++/83279 * src/filesystem/std-ops.cc (do_copy_file): Handle sendfile not copying entire file. From-SVN: r255666