[libcxx] r196058 - Fix for PRPR17934; based on a fix suggested by Peter Sommerlad

Alp Toker alp at nuanti.com
Wed Dec 11 11:55:54 PST 2013


Hi Bill,

I've tested and confirmed that Marshall's fix in r197061 resolves the 
libcxx issue in r196058.

Also confirmed that r196058 plus r197061 apply and work correctly 
against the 3.4 branch.

Please pull them in!

Thanks,
Alp.




On 11/12/2013 19:40, Marshall Clow wrote:
> On Dec 9, 2013, at 7:04 AM, Alp Toker <alp at nuanti.com> wrote:
>
>> Hi Marshall,
>>
>> This commit broke the build on Fedora 19 g++ (GCC) 4.8.2 20131017 (Red Hat 4.8.2-1)
>>
>> I've attached the build failure log. Reverting it fixes the LLVM ToT build with libcxx.
>>
>> CC'ing in Bill since this has been merged into the 3.4 branch.
> I believe that I’ve fixed this in r197061.
>
> Alp is testing now.
> Thanks for reporting this!
>
> — Marshall
>
>
>> Alp.
>>
>>
>> On 02/12/2013 03:24, Marshall Clow wrote:
>>> Author: marshall
>>> Date: Sun Dec  1 21:24:33 2013
>>> New Revision: 196058
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=196058&view=rev
>>> Log:
>>> Fix for PRPR17934; based on a fix suggested by Peter Sommerlad
>>>
>>> Modified:
>>>      libcxx/trunk/include/iterator
>>>      libcxx/trunk/test/containers/sequences/array/iterators.pass.cpp
>>>      libcxx/trunk/test/iterators/iterator.range/begin-end.pass.cpp
>>>
>>> Modified: libcxx/trunk/include/iterator
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=196058&r1=196057&r2=196058&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/include/iterator (original)
>>> +++ libcxx/trunk/include/iterator Sun Dec  1 21:24:33 2013
>>> @@ -1387,6 +1387,22 @@ operator+(typename __wrap_iter<_Iter>::d
>>>     #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
>>>   +template <class _Tp, size_t _Np>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +_Tp*
>>> +begin(_Tp (&__array)[_Np])
>>> +{
>>> +    return __array;
>>> +}
>>> +
>>> +template <class _Tp, size_t _Np>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +_Tp*
>>> +end(_Tp (&__array)[_Np])
>>> +{
>>> +    return __array + _Np;
>>> +}
>>> +
>>>   template <class _Cp>
>>>   inline _LIBCPP_INLINE_VISIBILITY
>>>   auto
>>> @@ -1421,18 +1437,46 @@ end(const _Cp& __c) -> decltype(__c.end(
>>>     #if _LIBCPP_STD_VER > 11
>>>   +template <class _Tp, size_t _Np>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np])
>>> +{
>>> +    return reverse_iterator<_Tp*>(__array + _Np);
>>> +}
>>> +
>>> +template <class _Tp, size_t _Np>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np])
>>> +{
>>> +    return reverse_iterator<_Tp*>(__array);
>>> +}
>>> +
>>> +template <class _Ep>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il)
>>> +{
>>> +    return reverse_iterator<const _Ep*>(__il.end());
>>> +}
>>> +
>>> +template <class _Ep>
>>> +inline _LIBCPP_INLINE_VISIBILITY
>>> +reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il)
>>> +{
>>> +    return reverse_iterator<const _Ep*>(__il.begin());
>>> +}
>>> +
>>>   template <class _Cp>
>>>   inline _LIBCPP_INLINE_VISIBILITY
>>>   auto cbegin(const _Cp& __c) -> decltype(begin(__c))
>>>   {
>>> -    return __c.begin();
>>> +    return _VSTD::begin(__c);
>>>   }
>>>     template <class _Cp>
>>>   inline _LIBCPP_INLINE_VISIBILITY
>>>   auto cend(const _Cp& __c) -> decltype(end(__c))
>>>   {
>>> -    return __c.end();
>>> +    return _VSTD::end(__c);
>>>   }
>>>     template <class _Cp>
>>> @@ -1516,53 +1560,6 @@ end(const _Cp& __c)
>>>     #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
>>>   -template <class _Tp, size_t _Np>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -_Tp*
>>> -begin(_Tp (&__array)[_Np])
>>> -{
>>> -    return __array;
>>> -}
>>> -
>>> -template <class _Tp, size_t _Np>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -_Tp*
>>> -end(_Tp (&__array)[_Np])
>>> -{
>>> -    return __array + _Np;
>>> -}
>>> -
>>> -#if _LIBCPP_STD_VER > 11
>>> -template <class _Tp, size_t _Np>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np])
>>> -{
>>> -    return reverse_iterator<_Tp*>(__array + _Np);
>>> -}
>>> -
>>> -template <class _Tp, size_t _Np>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np])
>>> -{
>>> -    return reverse_iterator<_Tp*>(__array);
>>> -}
>>> -
>>> -template <class _Ep>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il)
>>> -{
>>> -    return reverse_iterator<const _Ep*>(__il.end());
>>> -}
>>> -
>>> -template <class _Ep>
>>> -inline _LIBCPP_INLINE_VISIBILITY
>>> -reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il)
>>> -{
>>> -    return reverse_iterator<const _Ep*>(__il.begin());
>>> -}
>>> -
>>> -#endif
>>> -
>>>   _LIBCPP_END_NAMESPACE_STD
>>>     #endif  // _LIBCPP_ITERATOR
>>>
>>> Modified: libcxx/trunk/test/containers/sequences/array/iterators.pass.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/array/iterators.pass.cpp?rev=196058&r1=196057&r2=196058&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/test/containers/sequences/array/iterators.pass.cpp (original)
>>> +++ libcxx/trunk/test/containers/sequences/array/iterators.pass.cpp Sun Dec  1 21:24:33 2013
>>> @@ -50,11 +50,20 @@ int main()
>>>           assert ( !(ii1 != ii2 ));
>>>           assert ( !(ii1 != cii ));
>>>   -//         C c;
>>> -//         assert ( ii1 != c.cbegin());
>>> -//         assert ( cii != c.begin());
>>> -//         assert ( cii != c.cend());
>>> -//         assert ( ii1 != c.end());
>>> +        C c;
>>> +        assert ( c.begin()   == std::begin(c));
>>> +        assert ( c.cbegin()  == std::cbegin(c));
>>> +        assert ( c.rbegin()  == std::rbegin(c));
>>> +        assert ( c.crbegin() == std::crbegin(c));
>>> +        assert ( c.end()     == std::end(c));
>>> +        assert ( c.cend()    == std::cend(c));
>>> +        assert ( c.rend()    == std::rend(c));
>>> +        assert ( c.crend()   == std::crend(c));
>>> +
>>> +        assert ( std::begin(c)   != std::end(c));
>>> +        assert ( std::rbegin(c)  != std::rend(c));
>>> +        assert ( std::cbegin(c)  != std::cend(c));
>>> +        assert ( std::crbegin(c) != std::crend(c));
>>>           }
>>>           {
>>>           typedef std::array<int, 0> C;
>>> @@ -68,11 +77,20 @@ int main()
>>>           assert ( !(ii1 != ii2 ));
>>>           assert ( !(ii1 != cii ));
>>>   -//         C c;
>>> -//         assert ( ii1 != c.cbegin());
>>> -//         assert ( cii != c.begin());
>>> -//         assert ( cii != c.cend());
>>> -//         assert ( ii1 != c.end());
>>> +        C c;
>>> +        assert ( c.begin()   == std::begin(c));
>>> +        assert ( c.cbegin()  == std::cbegin(c));
>>> +        assert ( c.rbegin()  == std::rbegin(c));
>>> +        assert ( c.crbegin() == std::crbegin(c));
>>> +        assert ( c.end()     == std::end(c));
>>> +        assert ( c.cend()    == std::cend(c));
>>> +        assert ( c.rend()    == std::rend(c));
>>> +        assert ( c.crend()   == std::crend(c));
>>> +
>>> +        assert ( std::begin(c)   == std::end(c));
>>> +        assert ( std::rbegin(c)  == std::rend(c));
>>> +        assert ( std::cbegin(c)  == std::cend(c));
>>> +        assert ( std::crbegin(c) == std::crend(c));
>>>           }
>>>       }
>>>   #endif
>>>
>>> Modified: libcxx/trunk/test/iterators/iterator.range/begin-end.pass.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/iterators/iterator.range/begin-end.pass.cpp?rev=196058&r1=196057&r2=196058&view=diff
>>> ==============================================================================
>>> --- libcxx/trunk/test/iterators/iterator.range/begin-end.pass.cpp (original)
>>> +++ libcxx/trunk/test/iterators/iterator.range/begin-end.pass.cpp Sun Dec  1 21:24:33 2013
>>> @@ -52,6 +52,7 @@ void test_const_container( const std::in
>>>       assert ( std::end(c)     == c.end());
>>>   #if _LIBCPP_STD_VER > 11
>>>   //  initializer_list doesn't have cbegin/cend/rbegin/rend
>>> +//	but std::cbegin(),etc work (b/c they're general fn templates)
>>>   //     assert ( std::cbegin(c)  == c.cbegin());
>>>   //     assert ( std::cbegin(c)  != c.cend());
>>>   //     assert ( std::cend(c)    == c.cend());
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> -- 
>> http://www.nuanti.com
>> the browser experts
>>
>> <libcxx-fedora19.txt>

-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list