Allow declaration of map and multimap iterator with incomplete mapped type. Patch from eugenis
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@231119 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -614,8 +614,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_iterator | |||||||
| { | { | ||||||
|     typedef _NodePtr                                              __node_pointer; |     typedef _NodePtr                                              __node_pointer; | ||||||
|     typedef typename pointer_traits<__node_pointer>::element_type __node; |     typedef typename pointer_traits<__node_pointer>::element_type __node; | ||||||
|     typedef typename __node::base                                 __node_base; |  | ||||||
|     typedef typename __node_base::pointer                         __node_base_pointer; |  | ||||||
|  |  | ||||||
|     __node_pointer __ptr_; |     __node_pointer __ptr_; | ||||||
|  |  | ||||||
| @@ -644,17 +642,21 @@ public: | |||||||
|         {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} |         {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_iterator& operator++() |     __tree_iterator& operator++() { | ||||||
|         {__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); |       __ptr_ = static_cast<__node_pointer>( | ||||||
|          return *this;} |           __tree_next(static_cast<typename __node::base::pointer>(__ptr_))); | ||||||
|  |       return *this; | ||||||
|  |     } | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_iterator operator++(int) |     __tree_iterator operator++(int) | ||||||
|         {__tree_iterator __t(*this); ++(*this); return __t;} |         {__tree_iterator __t(*this); ++(*this); return __t;} | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_iterator& operator--() |     __tree_iterator& operator--() { | ||||||
|         {__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); |       __ptr_ = static_cast<__node_pointer>( | ||||||
|          return *this;} |           __tree_prev(static_cast<typename __node::base::pointer>(__ptr_))); | ||||||
|  |       return *this; | ||||||
|  |     } | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_iterator operator--(int) |     __tree_iterator operator--(int) | ||||||
|         {__tree_iterator __t(*this); --(*this); return __t;} |         {__tree_iterator __t(*this); --(*this); return __t;} | ||||||
| @@ -683,14 +685,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator | |||||||
| { | { | ||||||
|     typedef _ConstNodePtr                                         __node_pointer; |     typedef _ConstNodePtr                                         __node_pointer; | ||||||
|     typedef typename pointer_traits<__node_pointer>::element_type __node; |     typedef typename pointer_traits<__node_pointer>::element_type __node; | ||||||
|     typedef typename __node::base                                 __node_base; |  | ||||||
|     typedef typename pointer_traits<__node_pointer>::template |  | ||||||
| #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |  | ||||||
|             rebind<__node_base> |  | ||||||
| #else |  | ||||||
|             rebind<__node_base>::other |  | ||||||
| #endif |  | ||||||
|                                                                   __node_base_pointer; |  | ||||||
|  |  | ||||||
|     __node_pointer __ptr_; |     __node_pointer __ptr_; | ||||||
|  |  | ||||||
| @@ -735,17 +729,39 @@ public: | |||||||
|         {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} |         {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_const_iterator& operator++() |     __tree_const_iterator& operator++() { | ||||||
|         {__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); |       typedef typename pointer_traits<__node_pointer>::template | ||||||
|          return *this;} | #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES | ||||||
|  |           rebind<typename __node::base> | ||||||
|  | #else | ||||||
|  |           rebind<typename __node::base>::other | ||||||
|  | #endif | ||||||
|  |               __node_base_pointer; | ||||||
|  |  | ||||||
|  |       __ptr_ = static_cast<__node_pointer>( | ||||||
|  |           __tree_next(static_cast<__node_base_pointer>(__ptr_))); | ||||||
|  |       return *this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_const_iterator operator++(int) |     __tree_const_iterator operator++(int) | ||||||
|         {__tree_const_iterator __t(*this); ++(*this); return __t;} |         {__tree_const_iterator __t(*this); ++(*this); return __t;} | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_const_iterator& operator--() |     __tree_const_iterator& operator--() { | ||||||
|         {__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); |       typedef typename pointer_traits<__node_pointer>::template | ||||||
|          return *this;} | #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES | ||||||
|  |           rebind<typename __node::base> | ||||||
|  | #else | ||||||
|  |           rebind<typename __node::base>::other | ||||||
|  | #endif | ||||||
|  |               __node_base_pointer; | ||||||
|  |  | ||||||
|  |       __ptr_ = static_cast<__node_pointer>( | ||||||
|  |           __tree_prev(static_cast<__node_base_pointer>(__ptr_))); | ||||||
|  |       return *this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __tree_const_iterator operator--(int) |     __tree_const_iterator operator--(int) | ||||||
|         {__tree_const_iterator __t(*this); --(*this); return __t;} |         {__tree_const_iterator __t(*this); --(*this); return __t;} | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								include/map
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								include/map
									
									
									
									
									
								
							| @@ -644,14 +644,25 @@ struct __value_type | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | template <class _Tp> | ||||||
|  | struct __extract_key_value_types; | ||||||
|  |  | ||||||
|  | template <class _Key, class _Tp> | ||||||
|  | struct __extract_key_value_types<__value_type<_Key, _Tp> > | ||||||
|  | { | ||||||
|  |   typedef _Key const __key_type; | ||||||
|  |   typedef _Tp        __mapped_type; | ||||||
|  | }; | ||||||
|  |  | ||||||
| template <class _TreeIterator> | template <class _TreeIterator> | ||||||
| class _LIBCPP_TYPE_VIS_ONLY __map_iterator | class _LIBCPP_TYPE_VIS_ONLY __map_iterator | ||||||
| { | { | ||||||
|     _TreeIterator __i_; |     _TreeIterator __i_; | ||||||
|  |  | ||||||
|     typedef typename _TreeIterator::__pointer_traits             __pointer_traits; |     typedef typename _TreeIterator::__pointer_traits             __pointer_traits; | ||||||
|     typedef const typename _TreeIterator::value_type::value_type::first_type __key_type; |     typedef typename _TreeIterator::value_type __value_type; | ||||||
|     typedef typename _TreeIterator::value_type::value_type::second_type      __mapped_type; |     typedef typename __extract_key_value_types<__value_type>::__key_type    __key_type; | ||||||
|  |     typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type; | ||||||
| public: | public: | ||||||
|     typedef bidirectional_iterator_tag                           iterator_category; |     typedef bidirectional_iterator_tag                           iterator_category; | ||||||
|     typedef pair<__key_type, __mapped_type>                      value_type; |     typedef pair<__key_type, __mapped_type>                      value_type; | ||||||
| @@ -715,8 +726,9 @@ class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator | |||||||
|     _TreeIterator __i_; |     _TreeIterator __i_; | ||||||
|  |  | ||||||
|     typedef typename _TreeIterator::__pointer_traits             __pointer_traits; |     typedef typename _TreeIterator::__pointer_traits             __pointer_traits; | ||||||
|     typedef const typename _TreeIterator::value_type::value_type::first_type __key_type; |     typedef typename _TreeIterator::value_type __value_type; | ||||||
|     typedef typename _TreeIterator::value_type::value_type::second_type      __mapped_type; |     typedef typename __extract_key_value_types<__value_type>::__key_type    __key_type; | ||||||
|  |     typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type; | ||||||
| public: | public: | ||||||
|     typedef bidirectional_iterator_tag                           iterator_category; |     typedef bidirectional_iterator_tag                           iterator_category; | ||||||
|     typedef pair<__key_type, __mapped_type>                      value_type; |     typedef pair<__key_type, __mapped_type>                      value_type; | ||||||
| @@ -736,10 +748,9 @@ public: | |||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} |     __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     __map_const_iterator( |     __map_const_iterator(__map_iterator< | ||||||
|             __map_iterator<typename _TreeIterator::__non_const_iterator> __i) |         typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT | ||||||
|                 _NOEXCEPT |         : __i_(__i.__i_) {} | ||||||
|                 : __i_(__i.__i_) {} |  | ||||||
|  |  | ||||||
|     _LIBCPP_INLINE_VISIBILITY |     _LIBCPP_INLINE_VISIBILITY | ||||||
|     reference operator*() const {return __i_->__cc;} |     reference operator*() const {return __i_->__cc;} | ||||||
| @@ -829,7 +840,7 @@ public: | |||||||
|     typedef typename __alloc_traits::const_pointer         const_pointer; |     typedef typename __alloc_traits::const_pointer         const_pointer; | ||||||
|     typedef typename __alloc_traits::size_type             size_type; |     typedef typename __alloc_traits::size_type             size_type; | ||||||
|     typedef typename __alloc_traits::difference_type       difference_type; |     typedef typename __alloc_traits::difference_type       difference_type; | ||||||
|     typedef __map_iterator<typename __base::iterator>      iterator; |     typedef __map_iterator<typename __base::iterator>             iterator; | ||||||
|     typedef __map_const_iterator<typename __base::const_iterator> const_iterator; |     typedef __map_const_iterator<typename __base::const_iterator> const_iterator; | ||||||
|     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator; |     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator; | ||||||
|     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator; |     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator; | ||||||
|   | |||||||
| @@ -15,15 +15,15 @@ | |||||||
|  |  | ||||||
| #include <map> | #include <map> | ||||||
|  |  | ||||||
| #if !__has_feature(cxx_noexcept) |  | ||||||
|  |  | ||||||
| struct X | struct X | ||||||
| { | { | ||||||
|     std::map<int, X> m; |     std::map<int, X> m; | ||||||
|  |     std::map<int, X>::iterator i; | ||||||
|  |     std::map<int, X>::const_iterator ci; | ||||||
|  |     std::map<int, X>::reverse_iterator ri; | ||||||
|  |     std::map<int, X>::const_reverse_iterator cri; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| int main() | int main() | ||||||
| { | { | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,29 @@ | |||||||
|  | //===----------------------------------------------------------------------===// | ||||||
|  | // | ||||||
|  | //                     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. | ||||||
|  | // | ||||||
|  | //===----------------------------------------------------------------------===// | ||||||
|  |  | ||||||
|  | // <map> | ||||||
|  |  | ||||||
|  | // class multimap | ||||||
|  |  | ||||||
|  | // multimap(); | ||||||
|  |  | ||||||
|  | #include <map> | ||||||
|  |  | ||||||
|  | struct X | ||||||
|  | { | ||||||
|  |     std::multimap<int, X> m; | ||||||
|  |     std::multimap<int, X>::iterator i; | ||||||
|  |     std::multimap<int, X>::const_iterator ci; | ||||||
|  |     std::multimap<int, X>::reverse_iterator ri; | ||||||
|  |     std::multimap<int, X>::const_reverse_iterator cri; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Eric Fiselier
					Eric Fiselier