Skip to content

Commit ca3436e

Browse files
committed
Fix constant evaluation due to non-constant pointer_traits::pointer_to for gcc
1 parent def3975 commit ca3436e

File tree

1 file changed

+61
-9
lines changed

1 file changed

+61
-9
lines changed

libcxx/include/forward_list

+61-9
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,16 @@ struct __forward_node_traits {
300300
return __p;
301301
}
302302
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node(__node_pointer __p) {
303-
return __p ? pointer_traits<__begin_node_pointer>::pointer_to(*__p) : static_cast<__begin_node_pointer>(nullptr);
303+
# ifdef _LIBCPP_CXX03_LANG
304+
return static_cast<__begin_node_pointer>(__p);
305+
# else
306+
if constexpr (std::is_pointer<__begin_node_pointer>::value) {
307+
return static_cast<__begin_node_pointer>(__p);
308+
} else {
309+
return __p ? __begin_node_pointer::pointer_to(*static_cast<__begin_node*>(std::addressof(*__p)))
310+
: static_cast<__begin_node_pointer>(nullptr);
311+
}
312+
# endif
304313
}
305314
};
306315

@@ -315,8 +324,16 @@ struct __forward_begin_node {
315324
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_begin_node(pointer __n) : __next_(__n) {}
316325

317326
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __next_as_begin() const {
318-
return __next_ ? pointer_traits<__begin_node_pointer>::pointer_to(*__next_)
319-
: static_cast<__begin_node_pointer>(nullptr);
327+
# ifdef _LIBCPP_CXX03_LANG
328+
return static_cast<__begin_node_pointer>(__next_);
329+
# else
330+
if constexpr (std::is_pointer<__begin_node_pointer>::value) {
331+
return static_cast<__begin_node_pointer>(__next_);
332+
} else {
333+
return __next_ ? __begin_node_pointer::pointer_to(*static_cast<__forward_begin_node*>(std::addressof(*__next_)))
334+
: static_cast<__begin_node_pointer>(nullptr);
335+
}
336+
# endif
320337
}
321338
};
322339

@@ -363,6 +380,7 @@ template <class _NodePtr>
363380
class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
364381
typedef __forward_node_traits<_NodePtr> __traits;
365382
typedef typename __traits::__node_type __node_type;
383+
typedef typename __traits::__begin_node __begin_node_type;
366384
typedef typename __traits::__node_pointer __node_pointer;
367385
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
368386
typedef typename __traits::__void_pointer __void_pointer;
@@ -371,9 +389,17 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
371389

372390
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin() const { return __ptr_; }
373391
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer() const {
374-
return __ptr_ ? pointer_traits<__node_pointer>::pointer_to(
375-
const_cast<__node_type&>(static_cast<const __node_type&>(*__ptr_)))
376-
: static_cast<__node_pointer>(nullptr);
392+
# ifdef _LIBCPP_CXX03_LANG
393+
return static_cast<__node_pointer>(__ptr_);
394+
# else
395+
if constexpr (std::is_pointer<__node_pointer>::value) {
396+
return static_cast<__node_pointer>(__ptr_);
397+
} else {
398+
return __ptr_ ? __node_pointer::pointer_to(
399+
*static_cast<__node_type*>(const_cast<__begin_node_type*>(std::addressof(*__ptr_))))
400+
: static_cast<__node_pointer>(nullptr);
401+
}
402+
# endif
377403
}
378404

379405
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator(nullptr_t) _NOEXCEPT
@@ -434,6 +460,7 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
434460

435461
typedef __forward_node_traits<_NodePtr> __traits;
436462
typedef typename __traits::__node_type __node_type;
463+
typedef typename __traits::__begin_node __begin_node_type;
437464
typedef typename __traits::__node_pointer __node_pointer;
438465
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
439466
typedef typename __traits::__void_pointer __void_pointer;
@@ -442,9 +469,17 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
442469

443470
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin() const { return __ptr_; }
444471
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer() const {
445-
return __ptr_ ? pointer_traits<__node_pointer>::pointer_to(
446-
const_cast<__node_type&>(static_cast<const __node_type&>(*__ptr_)))
447-
: static_cast<__node_pointer>(nullptr);
472+
# ifdef _LIBCPP_CXX03_LANG
473+
return static_cast<__node_pointer>(__ptr_);
474+
# else
475+
if constexpr (std::is_pointer<__node_pointer>::value) {
476+
return static_cast<__node_pointer>(__ptr_);
477+
} else {
478+
return __ptr_ ? __node_pointer::pointer_to(
479+
*static_cast<__node_type*>(const_cast<__begin_node_type*>(std::addressof(*__ptr_))))
480+
: static_cast<__node_pointer>(nullptr);
481+
}
482+
# endif
448483
}
449484

450485
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator(nullptr_t) _NOEXCEPT
@@ -518,10 +553,27 @@ protected:
518553
_LIBCPP_COMPRESSED_PAIR(__begin_node, __before_begin_, __node_allocator, __alloc_);
519554

520555
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin() _NOEXCEPT {
556+
# ifdef _LIBCPP_CXX03_LANG
521557
return pointer_traits<__begin_node_pointer>::pointer_to(__before_begin_);
558+
# else
559+
if constexpr (std::is_pointer<__begin_node_pointer>::value) {
560+
return std::addressof(__before_begin_);
561+
} else {
562+
return __begin_node_pointer::pointer_to(*std::addressof(__before_begin_));
563+
}
564+
# endif
522565
}
566+
523567
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin() const _NOEXCEPT {
568+
# ifdef _LIBCPP_CXX03_LANG
524569
return pointer_traits<__begin_node_pointer>::pointer_to(const_cast<__begin_node&>(__before_begin_));
570+
# else
571+
if constexpr (std::is_pointer<__begin_node_pointer>::value) {
572+
return const_cast<__begin_node*>(std::addressof(__before_begin_));
573+
} else {
574+
return __begin_node_pointer::pointer_to(*const_cast<__begin_node*>(std::addressof(__before_begin_)));
575+
}
576+
# endif
525577
}
526578

527579
typedef __forward_list_iterator<__node_pointer> iterator;

0 commit comments

Comments
 (0)