Merging r-196058:

------------------------------------------------------------------------
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
------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/branches/release_34@197013 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling
2013-12-11 07:25:36 +00:00
parent 971d716332
commit e356070e1a
3 changed files with 59 additions and 75 deletions

View File

@@ -1387,22 +1387,6 @@ 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
@@ -1437,46 +1421,18 @@ 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 _VSTD::begin(__c);
return __c.begin();
}
template <class _Cp>
inline _LIBCPP_INLINE_VISIBILITY
auto cend(const _Cp& __c) -> decltype(end(__c))
{
return _VSTD::end(__c);
return __c.end();
}
template <class _Cp>
@@ -1560,6 +1516,53 @@ 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

View File

@@ -50,20 +50,11 @@ int main()
assert ( !(ii1 != ii2 ));
assert ( !(ii1 != cii ));
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));
// C c;
// assert ( ii1 != c.cbegin());
// assert ( cii != c.begin());
// assert ( cii != c.cend());
// assert ( ii1 != c.end());
}
{
typedef std::array<int, 0> C;
@@ -77,20 +68,11 @@ int main()
assert ( !(ii1 != ii2 ));
assert ( !(ii1 != cii ));
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));
// C c;
// assert ( ii1 != c.cbegin());
// assert ( cii != c.begin());
// assert ( cii != c.cend());
// assert ( ii1 != c.end());
}
}
#endif

View File

@@ -52,7 +52,6 @@ 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());