@@ -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>
363380class _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