Compiling Gecko with libc++ and GCC 4.9 on Android runs into a problem.
The protobuf #includes and libc++ result in preprocessed code that looks
something like:
/* via <iterator> */
namespace std {
namespace __1 {
}
using namespace __1 __attribute__((__strong__));
}
namespace std { namespace __1 {
template <class _Iter>
class __wrap_iter
{
...
template <class _Tp, class _Alloc> friend class vector;
...
};
} // namespace __1
} // namespace std
/* via <vector> */
namespace std { namespace __1 {
template <class _Tp, class _Alloc>
class _LIBCPP_TYPE_VIS_ONLY vector : ...
{ ... };
} // namespace __1
} // namespace std
and the problem is that GCC doesn't understand that the forward
declaration of vector inside __wrap_iter is forward-declaring the actual
vector class; it thinks it's declaring something else.
Hacking <iterator> to include _LIBCPP_TYPE_VIS_ONLY for the forward
declaration doesn't help. What does help is including <vector> earlier
than <iterator>, so the __wrap_iter forward declaration picks up the
correct definition of std::vector, and makes everything happy. It's
possible that there are other places that could get this same treatment,
but this one place was the only one I needed to modify to make things
go.