<div dir="ltr">I would support merging this change.<div><br></div><div>/Eric</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 10, 2016 at 3:20 PM, Hans Wennborg via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Should we merge this to 3.9? Looks like a straight-forward fix for<br>
something that was hit by real code.<br>
<br>
Thanks,<br>
Hans<br>
<div class="HOEnZb"><div class="h5"><br>
On Wed, Aug 10, 2016 at 1:04 PM, Marshall Clow via cfe-commits<br>
<<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
> Author: marshall<br>
> Date: Wed Aug 10 15:04:46 2016<br>
> New Revision: 278282<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=278282&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=278282&view=rev</a><br>
> Log:<br>
> std:: quailfy the calls for cend/crend/cbegin/cend. Fixes bug 28927.<br>
><br>
> Added:<br>
>     libcxx/trunk/test/std/<wbr>iterators/iterator.range/<wbr>begin-end.fail.cpp<br>
> Modified:<br>
>     libcxx/trunk/include/iterator<br>
><br>
> Modified: libcxx/trunk/include/iterator<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=278282&r1=278281&r2=278282&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/include/<wbr>iterator?rev=278282&r1=278281&<wbr>r2=278282&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- libcxx/trunk/include/iterator (original)<br>
> +++ libcxx/trunk/include/iterator Wed Aug 10 15:04:46 2016<br>
> @@ -1632,16 +1632,16 @@ reverse_iterator<const _Ep*> rend(initia<br>
><br>
>  template <class _Cp><br>
>  inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11<br>
> -auto cbegin(const _Cp& __c) -> decltype(begin(__c))<br>
> +auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c))<br>
>  {<br>
> -    return begin(__c);<br>
> +    return _VSTD::begin(__c);<br>
>  }<br>
><br>
>  template <class _Cp><br>
>  inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11<br>
> -auto cend(const _Cp& __c) -> decltype(end(__c))<br>
> +auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c))<br>
>  {<br>
> -    return end(__c);<br>
> +    return _VSTD::end(__c);<br>
>  }<br>
><br>
>  template <class _Cp><br>
> @@ -1674,16 +1674,16 @@ auto rend(const _Cp& __c) -> decltype(__<br>
><br>
>  template <class _Cp><br>
>  inline _LIBCPP_INLINE_VISIBILITY<br>
> -auto crbegin(const _Cp& __c) -> decltype(rbegin(__c))<br>
> +auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c))<br>
>  {<br>
> -    return rbegin(__c);<br>
> +    return _VSTD::rbegin(__c);<br>
>  }<br>
><br>
>  template <class _Cp><br>
>  inline _LIBCPP_INLINE_VISIBILITY<br>
> -auto crend(const _Cp& __c) -> decltype(rend(__c))<br>
> +auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c))<br>
>  {<br>
> -    return rend(__c);<br>
> +    return _VSTD::rend(__c);<br>
>  }<br>
><br>
>  #endif<br>
><br>
> Added: libcxx/trunk/test/std/<wbr>iterators/iterator.range/<wbr>begin-end.fail.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/iterators/iterator.range/begin-end.fail.cpp?rev=278282&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/std/<wbr>iterators/iterator.range/<wbr>begin-end.fail.cpp?rev=278282&<wbr>view=auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- libcxx/trunk/test/std/<wbr>iterators/iterator.range/<wbr>begin-end.fail.cpp (added)<br>
> +++ libcxx/trunk/test/std/<wbr>iterators/iterator.range/<wbr>begin-end.fail.cpp Wed Aug 10 15:04:46 2016<br>
> @@ -0,0 +1,51 @@<br>
> +//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is dual licensed under the MIT and the University of Illinois Open<br>
> +// Source Licenses. See LICENSE.TXT for details.<br>
> +//<br>
> +//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
> +<br>
> +#include "test_macros.h"<br>
> +<br>
> +#if TEST_STD_VER < 11<br>
> +#error<br>
> +#else<br>
> +<br>
> +// <iterator><br>
> +// template <class C> auto begin(C& c) -> decltype(c.begin());<br>
> +// template <class C> auto begin(const C& c) -> decltype(c.begin());<br>
> +// template <class C> auto end(C& c) -> decltype(c.end());<br>
> +// template <class C> auto end(const C& c) -> decltype(c.end());<br>
> +// template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il);<br>
> +// template <class E> reverse_iterator<const E*> rend(initializer_list<E> il);<br>
> +<br>
> +<br>
> +#include <iterator><br>
> +#include <cassert><br>
> +<br>
> +namespace Foo {<br>
> +       struct FakeContainer {};<br>
> +       typedef int FakeIter;<br>
> +<br>
> +       FakeIter begin(const FakeContainer &)   { return 1; }<br>
> +       FakeIter end  (const FakeContainer &)   { return 2; }<br>
> +       FakeIter rbegin(const FakeContainer &)  { return 3; }<br>
> +       FakeIter rend  (const FakeContainer &)  { return 4; }<br>
> +<br>
> +       FakeIter cbegin(const FakeContainer &)  { return 11; }<br>
> +       FakeIter cend  (const FakeContainer &)  { return 12; }<br>
> +       FakeIter crbegin(const FakeContainer &) { return 13; }<br>
> +       FakeIter crend  (const FakeContainer &) { return 14; }<br>
> +}<br>
> +<br>
> +<br>
> +int main(){<br>
> +// Bug #28927 - shouldn't find these via ADL<br>
> +       (void) std::cbegin (Foo::FakeContainer());<br>
> +       (void) std::cend   (Foo::FakeContainer());<br>
> +       (void) std::crbegin(Foo::<wbr>FakeContainer());<br>
> +       (void) std::crend  (Foo::FakeContainer());<br>
> +}<br>
> +#endif<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div>