[libcxx] r269789 - Implement LWG2576: istream_iterator and ostream_iterator should use std::addressof

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Tue May 17 14:30:12 PDT 2016


Thanks Richard, I wouldn't have gotten that. One day I'll understand
locales.
On May 17, 2016 3:22 PM, "Richard Smith" <richard at 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 at 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 <eric at 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 <eric at 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 <eric at 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 <dblaikie at 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 <eric at 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 at lists.llvm.org> wrote:
>>>>>>>
>>>>>>>> Test coverage?
>>>>>>>>
>>>>>>>> On Tue, May 17, 2016 at 10:44 AM, Marshall Clow via cfe-commits <
>>>>>>>> cfe-commits at 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 at lists.llvm.org
>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> cfe-commits mailing list
>>>>>>>> cfe-commits at lists.llvm.org
>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160517/0a533e96/attachment-0001.html>


More information about the cfe-commits mailing list