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

Reply via email to