From: Jonathan Wakely Date: Wed, 8 Aug 2018 15:40:21 +0000 (+0100) Subject: PR libstdc++/86734 use addressof in reverse_iterator::operator-> X-Git-Tag: releases/gcc-6.5.0~126 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2751aed2cf42d3a9922ca76029b653306a3b30d2;p=thirdparty%2Fgcc.git PR libstdc++/86734 use addressof in reverse_iterator::operator-> Backport from mainline 2018-07-30 Jonathan Wakely PR libstdc++/86734 * include/bits/stl_iterator.h (reverse_iterator::operator->): Use addressof (LWG 2188). * testsuite/24_iterators/reverse_iterator/dr2188.cc: New test. From-SVN: r263416 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a0a9d87e0ad5..f725add9f911 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2018-08-08 Jonathan Wakely + Backport from mainline + 2018-07-30 Jonathan Wakely + + PR libstdc++/86734 + * include/bits/stl_iterator.h (reverse_iterator::operator->): Use + addressof (LWG 2188). + * testsuite/24_iterators/reverse_iterator/dr2188.cc: New test. + Backport from mainline 2018-05-19 Jonathan Wakely diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 17e6ff0691ad..6e69a7b105df 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -118,6 +118,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ // _GLIBCXX_RESOLVE_LIB_DEFECTS // 235 No specification of default ctor for reverse_iterator + // 1012. reverse_iterator default ctor should value initialize reverse_iterator() : current() { } /** @@ -169,9 +170,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * * This requires that @c --current is dereferenceable. */ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2188. Reverse iterator does not fully support targets that overload & pointer operator->() const - { return &(operator*()); } + { return std::__addressof(operator*()); } /** * @return @c *this diff --git a/libstdc++-v3/testsuite/24_iterators/reverse_iterator/dr2188.cc b/libstdc++-v3/testsuite/24_iterators/reverse_iterator/dr2188.cc new file mode 100644 index 000000000000..047334ddf24c --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/reverse_iterator/dr2188.cc @@ -0,0 +1,47 @@ +// Copyright (C) 2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-do run { target c++11 } } + +// PR libstdc++/86734 + +#include +#include + +void +test01() +{ + // LWG DR 2188 + // Reverse iterator does not fully support targets that overload operator& + struct X { + int val; + int* operator&() { return &val; } + const int* operator&() const { return &val; } + }; + + X x[2] = { {1}, {2} }; + std::reverse_iterator rev(x+2); + VERIFY( rev->val == 2 ); + ++rev; + VERIFY( rev->val == 1 ); +} + +int +main() +{ + test01(); +}