]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/86734 use addressof in reverse_iterator::operator->
authorJonathan Wakely <jwakely@redhat.com>
Wed, 8 Aug 2018 15:40:21 +0000 (16:40 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 8 Aug 2018 15:40:21 +0000 (16:40 +0100)
Backport from mainline
2018-07-30  Jonathan Wakely  <jwakely@redhat.com>

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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_iterator.h
libstdc++-v3/testsuite/24_iterators/reverse_iterator/dr2188.cc [new file with mode: 0644]

index a0a9d87e0ad5c30107afceff211ec62b62e31e4f..f725add9f911451d26fc6746f4fbbddae7276949 100644 (file)
@@ -1,5 +1,13 @@
 2018-08-08  Jonathan Wakely  <jwakely@redhat.com>
 
+       Backport from mainline
+       2018-07-30  Jonathan Wakely  <jwakely@redhat.com>
+
+       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  <jwakely@redhat.com>
 
index 17e6ff0691adb7b142f547e92a7be5813f9ae12b..6e69a7b105df8c9d1d63b2d18eeb72bc621cfe64 100644 (file)
@@ -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 (file)
index 0000000..047334d
--- /dev/null
@@ -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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do run { target c++11 } }
+
+// PR libstdc++/86734
+
+#include <iterator>
+#include <testsuite_hooks.h>
+
+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<X*> rev(x+2);
+  VERIFY( rev->val == 2 );
+  ++rev;
+  VERIFY( rev->val == 1 );
+}
+
+int
+main()
+{
+  test01();
+}