[libcxx] r196058 - Fix for PRPR17934; based on a fix suggested by Peter Sommerlad
Marshall Clow
mclow.lists at gmail.com
Sun Dec 1 19:24:33 PST 2013
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());
More information about the cfe-commits
mailing list