Hi Jonathan, On Wed, Jul 22 2020, Jonathan Wakely via Gcc-patches wrote: > libstdc++-v3/ChangeLog: > > * include/bits/stl_iterator.h (reverse_iterator): Constrain > converting constructor and converting assignment operator. > Access source iterator's data member directly instead of > calling base(). > (move_iterator): Likewise. > * testsuite/24_iterators/move_iterator/dr3435.cc: New test. > * testsuite/24_iterators/reverse_iterator/dr3435.cc: New test. > > Tested powerpc64le-linux, committed to trunk. >
with this patch, I fail to build 541.leela_r from SPEC INT 2017 even when I specifically pass -std=c++98 to all compiler invocations. Is that expected? A simple reproducer is: ------------------------------ aaa.cpp ------------------------------ #include <vector> typedef unsigned long long int uint64; std::vector<uint64> ko_hash_history; uint64 ko_hash; bool bar(std::vector<uint64>::const_reverse_iterator fisrst, std::vector<uint64>::const_reverse_iterator last, std::vector<uint64>::const_reverse_iterator res); bool foo(void) { std::vector<uint64>::const_reverse_iterator first = ko_hash_history.rbegin(); std::vector<uint64>::const_reverse_iterator last = ko_hash_history.rend(); std::vector<uint64>::const_reverse_iterator res; return bar(first, last, res); } ---------------------------------------------------------------------- $ /home/mjambor/gcc/mine/inst/bin/g++ -std=c++98 -m64 -c -O2 -g aaa.cpp In file included from /home/mjambor/gcc/mine/inst/include/c++/11.0.0/bits/stl_algobase.h:67, from /home/mjambor/gcc/mine/inst/include/c++/11.0.0/vector:60, from aaa.cpp:1: /home/mjambor/gcc/mine/inst/include/c++/11.0.0/bits/stl_iterator.h: In instantiation of ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&) [with _Iter = __gnu_cxx::__normal_iterator<long long unsigned int*, std::vector<long long unsigned int> >; _Iterator = __gnu_cxx::__normal_iterator<const long long unsigned int*, std::vector<long long unsigned int> >]’: aaa.cpp:12:80: required from here /home/mjambor/gcc/mine/inst/include/c++/11.0.0/bits/stl_iterator.h:203:23: error: ‘__gnu_cxx::__normal_iterator<long long unsigned int*, std::vector<long long unsigned int> > std::reverse_iterator<__gnu_cxx::__normal_iterator<long long unsigned int*, std::vector<long long unsigned int> > >::current’ is protected within this context 203 | : current(__x.current) { } | ~~~~^~~~~~~ /home/mjambor/gcc/mine/inst/include/c++/11.0.0/bits/stl_iterator.h:146:17: note: declared protected here 146 | _Iterator current; | ^~~~~~~ ...which is exactly the error I get from leela. The error goes away when I use -std=c++11 instead (I promise I'll switch to building my benchmarks with that or c++14 over the remaining of this year :-). Is there a problem in the test (and the benchmark)? Should I file a PR? Thanks, Martin