Make __wrap_iter work with GCC again
Summary: This bug was originally fixed in http://reviews.llvm.org/D7201. However it was broken again by the fix to https://llvm.org/bugs/show_bug.cgi?id=22605. This patch re-fixes __wrap_iter with GCC by providing a forward declaration of <vector> before the friend declaration in __wrap_iter. This patch avoids the issues in PR22605 by putting canonical forward declarations in <iosfwd> and including <iosfwd> in <vector>. <iosfwd> was chosen as the canonical forward declaration headers for the following reasons: 1. `<iosfwd>` is small with almost no dependancies. 2. It already forward declares `std::allocator` 3. It is already included in `<iterator>` which we need to fix the GCC bug. This patch fixes the test "gcc_workaround.pass.cpp" Reviewers: mclow.lists, EricWF Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D16345 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@261382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -194,6 +194,11 @@ template <class _CharT, // for <stdexcept>
|
|||||||
typedef basic_string<char, char_traits<char>, allocator<char> > string;
|
typedef basic_string<char, char_traits<char>, allocator<char> > string;
|
||||||
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
|
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
|
||||||
|
|
||||||
|
|
||||||
|
// Include other forward declarations here
|
||||||
|
template <class _Tp, class _Alloc = allocator<_Tp> >
|
||||||
|
class _LIBCPP_TYPE_VIS_ONLY vector;
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // _LIBCPP_IOSFWD
|
#endif // _LIBCPP_IOSFWD
|
||||||
|
|||||||
@@ -340,10 +340,10 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
|
#include <iosfwd> // for forward declarations of vector and string.
|
||||||
#include <__functional_base>
|
#include <__functional_base>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <iosfwd>
|
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <Availability.h>
|
#include <Availability.h>
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
|
#include <iosfwd> // for forward declaration of vector
|
||||||
#include <__bit_reference>
|
#include <__bit_reference>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
@@ -453,7 +454,7 @@ __vector_base<_Tp, _Allocator>::~__vector_base()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator = allocator<_Tp> >
|
template <class _Tp, class _Allocator /* = allocator<_Tp> */>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY vector
|
class _LIBCPP_TYPE_VIS_ONLY vector
|
||||||
: private __vector_base<_Tp, _Allocator>
|
: private __vector_base<_Tp, _Allocator>
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user