[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-patches
Subject:    Re: [committed] libstdc++: Constrain reverse_iterator and move_iterator conversions [LWG 3435]
From:       Martin Jambor <mjambor () suse ! cz>
Date:       2020-07-31 22:49:15
Message-ID: ri6ft97jo5w.fsf () suse ! cz
[Download RAW message or body]

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic