This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
On 17/10/18 17:10 +0100, Jonathan Wakely wrote:
On 17/10/18 17:03 +0100, Jonathan Wakely wrote:On 09/10/18 07:11 +0200, François Dumont wrote:Here is the communication for my yesterday's patch which I thought svn had failed to commit (I had to interrupt it).Similarly to what I've done for associative containers here is a cleanup of the std::__debug::list implementation leveraging more on C++11 direct initialization.I also made sure we use consistent comparison between iterator/const_iterator in erase and emplace methods.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. Tested under Linux x86_64 Debug mode and committed. Françoisdiff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 8add1d596e0..879e1177497 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -521,15 +521,17 @@ namespace __debug // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); - for (_Base_const_iterator __victim = __first.base(); + for (__decltype(__first.base()) __victim = __first.base();This change causes the regression. I think the problem is that the decltype is a reference, so every time the loop does ++__victim it changes the iterator stored in __first.This would work: typedef typename __decltype(__first)::iterator_type _Base_iter; for (_Base_iter __victim = __first.base(); __victim != __last.base(); ++__victim) Or simply: #if __cplusplus >= 201103L typedef _Base_const_iterator _Base_iter; #else typedef _Base_iterator _Base_iter; #endif for (_Base_iter __victim = __first.base(); __victim != __last.base(); ++__victim) Or just restore the original code which worked fine!
Unrelated to this change, I'm also seeing some test failures when run with -O0 -D_GLIBCXX_DEBUG e.g. make check RUNTESTFLAGS="conformance.exp=23_containers/unordered_*/cliterators.cc --target_board=unix/-O0/-D_GLIBCXX_DEBUG" There are linker errors: FAIL: 23_containers/unordered_map/requirements/cliterators.cc (test for excess errors) Excess errors: /home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/safe_local_iterator.h:332: undefined reference to `__gnu_debug::_Safe_local_iterator_base::_M_attach_single(__gnu_debug::_Safe_sequence_base*, bool)' /home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/safe_local_iterator.h:332: undefined reference to `__gnu_debug::_Safe_local_iterator_base::_M_attach_single(__gnu_debug::_Safe_sequence_base*, bool)' collect2: error: ld returned 1 exit status UNRESOLVED: 23_containers/unordered_map/requirements/cliterators.cc compilation failed to produce executable
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |