Commit c50835da authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r196058:

------------------------------------------------------------------------
r196058 | marshall | 2013-12-01 19:24:33 -0800 (Sun, 01 Dec 2013) | 1 line

Fix for PRPR17934; based on a fix suggested by Peter Sommerlad
------------------------------------------------------------------------

llvm-svn: 196077
parent 78a80cd6
Loading
Loading
Loading
Loading
+46 −49
Original line number Diff line number Diff line
@@ -1387,6 +1387,22 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n,

#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
+28 −10
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ void test_const_container( const std::initializer_list<T> & c, T val ) {
    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());