diff options
| author | Roger Ferrer Ibanez <roger.ferreribanez@arm.com> | 2017-12-11 13:54:58 +0000 |
|---|---|---|
| committer | Roger Ferrer Ibanez <roger.ferreribanez@arm.com> | 2017-12-11 13:54:58 +0000 |
| commit | 6f56d3eee85c60f19e937fa72238b5ea2dfe79bd (patch) | |
| tree | fd4558878137a915cca817059edd4e013322378d /libcxx/include/iterator | |
| parent | 291e8d924ff47fdb9a0920a15a183ca699ecd6c0 (diff) | |
| download | bcm5719-llvm-6f56d3eee85c60f19e937fa72238b5ea2dfe79bd.tar.gz bcm5719-llvm-6f56d3eee85c60f19e937fa72238b5ea2dfe79bd.zip | |
[libcxx] Define istream_iterator equality comparison operators out-of-line
Currently libc++ defines operator== and operator!= as friend functions in the
definition of the istream_iterator class template. Such definition has a subtle
difference from an out-of-line definition required by the C++ Standard: these
functions can only be found by argument-dependent lookup, but not by qualified
lookup.
This patch changes the definition, so that it conforms to the C++ Standard and
adds a check involving qualified lookup to the test suite.
Patch contributed by Mikhail Maltsev.
Differential Revision: https://reviews.llvm.org/D40415
llvm-svn: 320363
Diffstat (limited to 'libcxx/include/iterator')
| -rw-r--r-- | libcxx/include/iterator | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator index d59d0b42cdd..8b887db037b 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -904,15 +904,37 @@ public: _LIBCPP_INLINE_VISIBILITY istream_iterator operator++(int) {istream_iterator __t(*this); ++(*this); return __t;} + template <class _Up, class _CharU, class _TraitsU, class _DistanceU> friend _LIBCPP_INLINE_VISIBILITY - bool operator==(const istream_iterator& __x, const istream_iterator& __y) - {return __x.__in_stream_ == __y.__in_stream_;} + bool + operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x, + const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y); + template <class _Up, class _CharU, class _TraitsU, class _DistanceU> friend _LIBCPP_INLINE_VISIBILITY - bool operator!=(const istream_iterator& __x, const istream_iterator& __y) - {return !(__x == __y);} + bool + operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x, + const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y); }; +template <class _Tp, class _CharT, class _Traits, class _Distance> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) +{ + return __x.__in_stream_ == __y.__in_stream_; +} + +template <class _Tp, class _CharT, class _Traits, class _Distance> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) +{ + return !(__x == __y); +} + template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> > class _LIBCPP_TEMPLATE_VIS ostream_iterator : public iterator<output_iterator_tag, void, void, void, void> |

