diff options
author | Hans Wennborg <hans@hanshq.net> | 2016-08-11 21:48:37 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2016-08-11 21:48:37 +0000 |
commit | 43d7c78a8690b2bb211142fe32465617bc296eb6 (patch) | |
tree | b55013d428757fa8bd0cc2c41db07eea8650d119 /libcxx | |
parent | eb6343e251ce6cfece7ae4e82f4282ea1e21a3ff (diff) | |
download | llvm-43d7c78a8690b2bb211142fe32465617bc296eb6.zip llvm-43d7c78a8690b2bb211142fe32465617bc296eb6.tar.gz llvm-43d7c78a8690b2bb211142fe32465617bc296eb6.tar.bz2 |
Merging r278282:
------------------------------------------------------------------------
r278282 | marshall | 2016-08-10 13:04:46 -0700 (Wed, 10 Aug 2016) | 1 line
std:: quailfy the calls for cend/crend/cbegin/cend. Fixes bug 28927.
------------------------------------------------------------------------
llvm-svn: 278426
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/iterator | 16 | ||||
-rw-r--r-- | libcxx/test/std/iterators/iterator.range/begin-end.fail.cpp | 51 |
2 files changed, 59 insertions, 8 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator index abd142e..0caabbb 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -1632,16 +1632,16 @@ reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il) template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 -auto cbegin(const _Cp& __c) -> decltype(begin(__c)) +auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c)) { - return begin(__c); + return _VSTD::begin(__c); } template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 -auto cend(const _Cp& __c) -> decltype(end(__c)) +auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c)) { - return end(__c); + return _VSTD::end(__c); } template <class _Cp> @@ -1674,16 +1674,16 @@ auto rend(const _Cp& __c) -> decltype(__c.rend()) template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY -auto crbegin(const _Cp& __c) -> decltype(rbegin(__c)) +auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c)) { - return rbegin(__c); + return _VSTD::rbegin(__c); } template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY -auto crend(const _Cp& __c) -> decltype(rend(__c)) +auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c)) { - return rend(__c); + return _VSTD::rend(__c); } #endif diff --git a/libcxx/test/std/iterators/iterator.range/begin-end.fail.cpp b/libcxx/test/std/iterators/iterator.range/begin-end.fail.cpp new file mode 100644 index 0000000..1a14930 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.range/begin-end.fail.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "test_macros.h" + +#if TEST_STD_VER < 11 +#error +#else + +// <iterator> +// template <class C> auto begin(C& c) -> decltype(c.begin()); +// template <class C> auto begin(const C& c) -> decltype(c.begin()); +// template <class C> auto end(C& c) -> decltype(c.end()); +// template <class C> auto end(const C& c) -> decltype(c.end()); +// template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il); +// template <class E> reverse_iterator<const E*> rend(initializer_list<E> il); + + +#include <iterator> +#include <cassert> + +namespace Foo { + struct FakeContainer {}; + typedef int FakeIter; + + FakeIter begin(const FakeContainer &) { return 1; } + FakeIter end (const FakeContainer &) { return 2; } + FakeIter rbegin(const FakeContainer &) { return 3; } + FakeIter rend (const FakeContainer &) { return 4; } + + FakeIter cbegin(const FakeContainer &) { return 11; } + FakeIter cend (const FakeContainer &) { return 12; } + FakeIter crbegin(const FakeContainer &) { return 13; } + FakeIter crend (const FakeContainer &) { return 14; } +} + + +int main(){ +// Bug #28927 - shouldn't find these via ADL + (void) std::cbegin (Foo::FakeContainer()); + (void) std::cend (Foo::FakeContainer()); + (void) std::crbegin(Foo::FakeContainer()); + (void) std::crend (Foo::FakeContainer()); +} +#endif |