[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