[libcxx] r227226 - [libcxx] Make __wrap_iter work with gcc.

David Blaikie dblaikie at gmail.com
Tue Jan 27 15:19:14 PST 2015


On Tue, Jan 27, 2015 at 11:27 AM, Nico Weber <nicolasweber at gmx.de> wrote:

> Author: nico
> Date: Tue Jan 27 13:27:39 2015
> New Revision: 227226
>
> URL: http://llvm.org/viewvc/llvm-project?rev=227226&view=rev
> Log:
> [libcxx] Make __wrap_iter work with gcc.
>
> he following snippet doesn't build when using gcc and libc++:
>
>     #include <string>
>     void f(const std::string& s) { s.begin(); }
>     #include <vector>
>     void AppendTo(const std::vector<char>& v) { v.begin(); }
>
> The problem is that __wrap_iter has a private constructor. It lists
> vector<>
> and basic_string<> as friends, but gcc seems to ignore this for vector<>
> for
> some reason. Declaring vector before the friend declaration in __wrap_iter
> is
> enough to work around this problem, so do that. With this patch, I'm able
> to
> build chromium/android with libc++. Without it, two translation units fail
> to
> build. (iosfwd already provides a forward declaration of basic_string.)
>
> As far as I can tell, this is due to a gcc bug, which I filed as
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64816.
>
> Fixes PR22355.
>
> http://reviews.llvm.org/D7201
>
> Added:
>
> libcxx/trunk/test/std/iterators/iterators.general/gcc_workaround.pass.cpp
> Modified:
>     libcxx/trunk/include/iterator
>
> Modified: libcxx/trunk/include/iterator
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=227226&r1=227225&r2=227226&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/iterator (original)
> +++ libcxx/trunk/include/iterator Tue Jan 27 13:27:39 2015
> @@ -1112,6 +1112,8 @@ typename enable_if
>  >::type
>  __unwrap_iter(__wrap_iter<_Tp*>);
>
> +template <class _Tp, class _Alloc> class _LIBCPP_TYPE_VIS_ONLY vector;
>

Worth including a comment that this is a workaround for a particular bug
(is there a GCC bug filed for this?)?


> +
>  template <class _Iter>
>  class __wrap_iter
>  {
>
> Added:
> libcxx/trunk/test/std/iterators/iterators.general/gcc_workaround.pass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/iterators/iterators.general/gcc_workaround.pass.cpp?rev=227226&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/iterators/iterators.general/gcc_workaround.pass.cpp
> (added)
> +++
> libcxx/trunk/test/std/iterators/iterators.general/gcc_workaround.pass.cpp
> Tue Jan 27 13:27:39 2015
> @@ -0,0 +1,20 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     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.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// Tests workaround for
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64816.
> +
> +#include <string>
> +
> +void f(const std::string &s) { s.begin(); }
> +
> +#include <vector>
> +
> +void AppendTo(const std::vector<char> &v) { v.begin(); }
> +
> +int main() {}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150127/5dbaa964/attachment.html>


More information about the cfe-commits mailing list