Thanks Richard, I wouldn't have gotten that. One day I'll understand locales. On May 17, 2016 3:22 PM, "Richard Smith" <rich...@metafoo.co.uk> wrote:
> Here's an istream_iterator test for this change: > > #include <sstream> > #include <iterator> > #include <cassert> > > struct evil_traits : std::char_traits<char> { > template<typename T> friend void operator&(T) = delete; > }; > > struct pointless_derived_class > : std::num_get<char, std::istreambuf_iterator<char, evil_traits>> {}; > > int main() { > std::basic_stringstream<char, evil_traits> ss("1 2 3"); > ss.imbue(std::locale(ss.getloc(), new pointless_derived_class)); > > using II = std::istream_iterator<int, char, evil_traits>; > int n = 0; > for (auto i = II(ss), e = II(); i != e; ++i) > n += *i; > assert(n == 6); > } > > PS: locales suck. > > On Tue, May 17, 2016 at 2:09 PM, Eric Fiselier via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> OK, I think I figured it out. I added tests for the ostream_iterator >> constructors in r269838. >> I'll follow that up with tests for the istream_iterator constructors, but >> my current test is failing for reasons beyond me. >> >> /Eric >> >> On Tue, May 17, 2016 at 2:36 PM, Eric Fiselier <e...@efcs.ca> wrote: >> >>> Or maybe I'm still wrong. I tried using a custom traits class to hijack >>> ADL for "operator&" but it doesn't seem to work. >>> >>> Sorry for the spam. >>> >>> /Eric >>> >>> On Tue, May 17, 2016 at 2:25 PM, Eric Fiselier <e...@efcs.ca> wrote: >>> >>>> Woops. I was incorrect. It seems that user defined "operator&" >>>> overloads can be found in the constructor. From the LWG issue: >>>> >>>> > Note that {i,o}stream_type are specializations of basic_{i,o}stream, >>>> but the constructors might still pick up an overloaded & via the traits >>>> template parameter. >>>> >>>> At least that also tells us how to test it. >>>> >>>> /Eric >>>> >>>> On Tue, May 17, 2016 at 2:08 PM, Eric Fiselier <e...@efcs.ca> wrote: >>>> >>>>> The difference between "operator&" and "addressof" is inconsequential >>>>> when user defined overloads of "operator&" can't be found, which is the >>>>> case for the changes in the stream iterator constructors. We might as well >>>>> keep it consistent though. I don't see any value changing it back to use >>>>> "operator&" in either the library or the standard. >>>>> >>>>> /Eric >>>>> >>>>> On Tue, May 17, 2016 at 2:02 PM, David Blaikie <dblai...@gmail.com> >>>>> wrote: >>>>> >>>>>> If some parts are not testable & as you say, not meaningful, then it >>>>>> seems OK to just not implement them & file a DR on the standard, no? >>>>>> >>>>>> On Tue, May 17, 2016 at 1:00 PM, Eric Fiselier <e...@efcs.ca> wrote: >>>>>> >>>>>>> I added a test for operator->() in r269812. Marshall and I discussed >>>>>>> offline about how not all parts of this change are testable (and hence >>>>>>> not >>>>>>> meaningful) but that's what the standard says to do. >>>>>>> >>>>>>> >>>>>>> On Tue, May 17, 2016 at 1:51 PM, David Blaikie via cfe-commits < >>>>>>> cfe-commits@lists.llvm.org> wrote: >>>>>>> >>>>>>>> Test coverage? >>>>>>>> >>>>>>>> On Tue, May 17, 2016 at 10:44 AM, Marshall Clow via cfe-commits < >>>>>>>> cfe-commits@lists.llvm.org> wrote: >>>>>>>> >>>>>>>>> Author: marshall >>>>>>>>> Date: Tue May 17 12:44:40 2016 >>>>>>>>> New Revision: 269789 >>>>>>>>> >>>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=269789&view=rev >>>>>>>>> Log: >>>>>>>>> Implement LWG2576: istream_iterator and ostream_iterator should >>>>>>>>> use std::addressof >>>>>>>>> >>>>>>>>> Modified: >>>>>>>>> libcxx/trunk/include/iterator >>>>>>>>> libcxx/trunk/www/cxx1z_status.html >>>>>>>>> >>>>>>>>> Modified: libcxx/trunk/include/iterator >>>>>>>>> URL: >>>>>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=269789&r1=269788&r2=269789&view=diff >>>>>>>>> >>>>>>>>> ============================================================================== >>>>>>>>> --- libcxx/trunk/include/iterator (original) >>>>>>>>> +++ libcxx/trunk/include/iterator Tue May 17 12:44:40 2016 >>>>>>>>> @@ -772,14 +772,14 @@ private: >>>>>>>>> _Tp __value_; >>>>>>>>> public: >>>>>>>>> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR >>>>>>>>> istream_iterator() : __in_stream_(0), __value_() {} >>>>>>>>> - _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) >>>>>>>>> : __in_stream_(&__s) >>>>>>>>> + _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) >>>>>>>>> : __in_stream_(_VSTD::addressof(__s)) >>>>>>>>> { >>>>>>>>> if (!(*__in_stream_ >> __value_)) >>>>>>>>> __in_stream_ = 0; >>>>>>>>> } >>>>>>>>> >>>>>>>>> _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const >>>>>>>>> {return __value_;} >>>>>>>>> - _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const >>>>>>>>> {return &(operator*());} >>>>>>>>> + _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const >>>>>>>>> {return _VSTD::addressof((operator*()));} >>>>>>>>> _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++() >>>>>>>>> { >>>>>>>>> if (!(*__in_stream_ >> __value_)) >>>>>>>>> @@ -811,9 +811,9 @@ private: >>>>>>>>> const char_type* __delim_; >>>>>>>>> public: >>>>>>>>> _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) >>>>>>>>> - : __out_stream_(&__s), __delim_(0) {} >>>>>>>>> + : __out_stream_(_VSTD::addressof(__s)), __delim_(0) {} >>>>>>>>> _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, >>>>>>>>> const _CharT* __delimiter) >>>>>>>>> - : __out_stream_(&__s), __delim_(__delimiter) {} >>>>>>>>> + : __out_stream_(_VSTD::addressof(__s)), >>>>>>>>> __delim_(__delimiter) {} >>>>>>>>> _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const >>>>>>>>> _Tp& __value_) >>>>>>>>> { >>>>>>>>> *__out_stream_ << __value_; >>>>>>>>> >>>>>>>>> Modified: libcxx/trunk/www/cxx1z_status.html >>>>>>>>> URL: >>>>>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=269789&r1=269788&r2=269789&view=diff >>>>>>>>> >>>>>>>>> ============================================================================== >>>>>>>>> --- libcxx/trunk/www/cxx1z_status.html (original) >>>>>>>>> +++ libcxx/trunk/www/cxx1z_status.html Tue May 17 12:44:40 2016 >>>>>>>>> @@ -222,7 +222,7 @@ >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2572";>2572</a></td><td>The >>>>>>>>> remarks for <tt>shared_ptr::operator*</tt> should apply to >>>>>>>>> <i>cv</i>-qualified <tt>void</tt> as >>>>>>>>> well</td><td>Jacksonville</td><td>Complete</td></tr> >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2574";>2574</a></td><td>[fund.ts.v2] >>>>>>>>> <tt>std::experimental::function::operator=(F&&)</tt> should be >>>>>>>>> constrained</td><td>Jacksonville</td><td></td></tr> >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2575";>2575</a></td><td>[fund.ts.v2] >>>>>>>>> <tt>experimental::function::assign</tt> should be >>>>>>>>> removed</td><td>Jacksonville</td><td></td></tr> >>>>>>>>> - <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2576";>2576</a></td><td><tt>istream_iterator</tt> >>>>>>>>> and <tt>ostream_iterator</tt> should use >>>>>>>>> <tt>std::addressof</tt></td><td>Jacksonville</td><td></td></tr> >>>>>>>>> + <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2576";>2576</a></td><td><tt>istream_iterator</tt> >>>>>>>>> and <tt>ostream_iterator</tt> should use >>>>>>>>> <tt>std::addressof</tt></td><td>Jacksonville</td><td>Complete</td></tr> >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2577";>2577</a></td><td><tt>{shared,unique}_lock</tt> >>>>>>>>> should use >>>>>>>>> <tt>std::addressof</tt></td><td>Jacksonville</td><td>Complete</td></tr> >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2579";>2579</a></td><td>Inconsistency >>>>>>>>> wrt Allocators in <tt>basic_string</tt> assignment vs. >>>>>>>>> <tt>basic_string::assign</tt></td><td>Jacksonville</td><td>Complete</td></tr> >>>>>>>>> <tr><td><a href=" >>>>>>>>> http://cplusplus.github.io/LWG/lwg-defects.html#2581";>2581</a></td><td>Specialization >>>>>>>>> of <tt><type_traits></tt> variable templates should be >>>>>>>>> prohibited</td><td>Jacksonville</td><td>Complete</td></tr> >>>>>>>>> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> cfe-commits mailing list >>>>>>>>> cfe-commits@lists.llvm.org >>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> cfe-commits mailing list >>>>>>>> cfe-commits@lists.llvm.org >>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits