Skip to content

Commit d067062

Browse files
authored
[libc++] fix array<T, 0> under USE_WRAP_ITER (#101156)
`array<T, 0>::iterator` was always a pointer even when `_LIBCXX_ABI_USE_WRAP_ITER_IN_STD_ARRAY` was defined. This patch fixes that minor bug. Discovered as part of [#100603][]. Drive-by: switch from `typedef` to `using` in `<array>` [#100603]: #100603
1 parent 99a0a12 commit d067062

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

libcxx/include/array

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ template <class T, size_t N >
1919
struct array
2020
{
2121
// types:
22-
typedef T & reference;
23-
typedef const T & const_reference;
24-
typedef implementation defined iterator;
25-
typedef implementation defined const_iterator;
26-
typedef size_t size_type;
27-
typedef ptrdiff_t difference_type;
28-
typedef T value_type;
29-
typedef T* pointer;
30-
typedef const T* const_pointer;
31-
typedef std::reverse_iterator<iterator> reverse_iterator;
32-
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
22+
using value_type = T;
23+
using pointer = T*;
24+
using const_pointer = const T*;
25+
using reference = T&;
26+
using const_reference = const T&;
27+
using size_type = size_t;
28+
using difference_type = ptrdiff_t;
29+
using iterator = implementation-defined;
30+
using const_iterator = implementation-defined;
31+
using reverse_iterator = std::reverse_iterator<iterator>;
32+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
3333
3434
// No explicit construct/copy/destroy for aggregate type
3535
void fill(const T& u); // constexpr in C++20
@@ -270,20 +270,25 @@ struct _LIBCPP_TEMPLATE_VIS array {
270270
template <class _Tp>
271271
struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> {
272272
// types:
273-
typedef array __self;
274-
typedef _Tp value_type;
275-
typedef value_type& reference;
276-
typedef const value_type& const_reference;
277-
typedef value_type* iterator;
278-
typedef const value_type* const_iterator;
279-
typedef value_type* pointer;
280-
typedef const value_type* const_pointer;
281-
typedef size_t size_type;
282-
typedef ptrdiff_t difference_type;
283-
typedef std::reverse_iterator<iterator> reverse_iterator;
284-
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
285-
286-
typedef __conditional_t<is_const<_Tp>::value, const __empty, __empty> _EmptyType;
273+
using __self = array;
274+
using value_type = _Tp;
275+
using reference = value_type&;
276+
using const_reference = const value_type&;
277+
using pointer = value_type*;
278+
using const_pointer = const value_type*;
279+
#if defined(_LIBCPP_ABI_USE_WRAP_ITER_IN_STD_ARRAY)
280+
using iterator = __wrap_iter<pointer>;
281+
using const_iterator = __wrap_iter<const_pointer>;
282+
#else
283+
using iterator = pointer;
284+
using const_iterator = const_pointer;
285+
#endif
286+
using size_type = size_t;
287+
using difference_type = ptrdiff_t;
288+
using reverse_iterator = std::reverse_iterator<iterator>;
289+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
290+
291+
using _EmptyType = __conditional_t<is_const<_Tp>::value, const __empty, __empty>;
287292

288293
struct _ArrayInStructT {
289294
_Tp __data_[1];
@@ -440,7 +445,7 @@ struct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > : public integral_con
440445
template <size_t _Ip, class _Tp, size_t _Size>
441446
struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > {
442447
static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)");
443-
typedef _Tp type;
448+
using type = _Tp;
444449
};
445450

446451
template <size_t _Ip, class _Tp, size_t _Size>

0 commit comments

Comments
 (0)