On Tue, Jan 27, 2015 at 11:27 AM, Nico Weber <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
