LWG issue #2188: Reverse iterator does not fully support targets that overload operator&. Also mark #2272 and #2299  as complete; libc++ already implements them.

llvm-svn: 202339
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: c204c130fabdffa131d487ec1c701fc95dba0ffe
diff --git a/include/iterator b/include/iterator
index 28a946c..b1bcdfc 100644
--- a/include/iterator
+++ b/include/iterator
@@ -327,6 +327,7 @@
 */
 
 #include <__config>
+#include <__functional_base>
 #include <type_traits>
 #include <cstddef>
 #include <iosfwd>
@@ -549,7 +550,7 @@
         : __t(__u.base()), current(__u.base()) {}
     _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;}
     _LIBCPP_INLINE_VISIBILITY reference operator*() const {__t = current; return *--__t;}
-    _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return &(operator*());}
+    _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return _VSTD::addressof(operator*());}
     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;}
     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator++(int)
         {reverse_iterator __tmp(*this); --current; return __tmp;}