@@ -296,7 +296,16 @@ struct __forward_node_traits {
296296# endif
297297
298298 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node (__node_pointer __p) {
299- return __p ? pointer_traits<__begin_node_pointer>::pointer_to (*__p) : static_cast <__begin_node_pointer>(nullptr );
299+ # ifdef _LIBCPP_CXX03_LANG
300+ return static_cast <__begin_node_pointer>(__p);
301+ # else
302+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
303+ return static_cast <__begin_node_pointer>(__p);
304+ } else {
305+ return __p ? __begin_node_pointer::pointer_to (*static_cast <__begin_node*>(std::addressof (*__p)))
306+ : static_cast <__begin_node_pointer>(nullptr );
307+ }
308+ # endif
300309 }
301310};
302311
@@ -311,8 +320,16 @@ struct __forward_begin_node {
311320 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_begin_node (pointer __n) : __next_(__n) {}
312321
313322 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __next_as_begin () const {
314- return __next_ ? pointer_traits<__begin_node_pointer>::pointer_to (*__next_)
315- : static_cast <__begin_node_pointer>(nullptr );
323+ # ifdef _LIBCPP_CXX03_LANG
324+ return static_cast <__begin_node_pointer>(__next_);
325+ # else
326+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
327+ return static_cast <__begin_node_pointer>(__next_);
328+ } else {
329+ return __next_ ? __begin_node_pointer::pointer_to (*static_cast <__forward_begin_node*>(std::addressof (*__next_)))
330+ : static_cast <__begin_node_pointer>(nullptr );
331+ }
332+ # endif
316333 }
317334};
318335
@@ -359,6 +376,7 @@ template <class _NodePtr>
359376class __forward_list_iterator {
360377 typedef __forward_node_traits<_NodePtr> __traits;
361378 typedef typename __traits::__node_type __node_type;
379+ typedef typename __traits::__begin_node __begin_node_type;
362380 typedef typename __traits::__node_pointer __node_pointer;
363381 typedef typename __traits::__begin_node_pointer __begin_node_pointer;
364382 typedef typename __traits::__void_pointer __void_pointer;
@@ -367,9 +385,17 @@ class __forward_list_iterator {
367385
368386 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
369387 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
370- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
371- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
372- : static_cast <__node_pointer>(nullptr );
388+ # ifdef _LIBCPP_CXX03_LANG
389+ return static_cast <__node_pointer>(__ptr_);
390+ # else
391+ if constexpr (std::is_pointer<__node_pointer>::value) {
392+ return static_cast <__node_pointer>(__ptr_);
393+ } else {
394+ return __ptr_ ? __node_pointer::pointer_to (
395+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
396+ : static_cast <__node_pointer>(nullptr );
397+ }
398+ # endif
373399 }
374400
375401 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator (nullptr_t ) _NOEXCEPT
@@ -429,6 +455,7 @@ class __forward_list_const_iterator {
429455
430456 typedef __forward_node_traits<_NodePtr> __traits;
431457 typedef typename __traits::__node_type __node_type;
458+ typedef typename __traits::__begin_node __begin_node_type;
432459 typedef typename __traits::__node_pointer __node_pointer;
433460 typedef typename __traits::__begin_node_pointer __begin_node_pointer;
434461 typedef typename __traits::__void_pointer __void_pointer;
@@ -437,9 +464,17 @@ class __forward_list_const_iterator {
437464
438465 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
439466 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
440- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
441- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
442- : static_cast <__node_pointer>(nullptr );
467+ # ifdef _LIBCPP_CXX03_LANG
468+ return static_cast <__node_pointer>(__ptr_);
469+ # else
470+ if constexpr (std::is_pointer<__node_pointer>::value) {
471+ return static_cast <__node_pointer>(__ptr_);
472+ } else {
473+ return __ptr_ ? __node_pointer::pointer_to (
474+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
475+ : static_cast <__node_pointer>(nullptr );
476+ }
477+ # endif
443478 }
444479
445480 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator (nullptr_t ) _NOEXCEPT
@@ -512,10 +547,27 @@ protected:
512547 _LIBCPP_COMPRESSED_PAIR (__begin_node, __before_begin_, __node_allocator, __alloc_);
513548
514549 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () _NOEXCEPT {
550+ # ifdef _LIBCPP_CXX03_LANG
515551 return pointer_traits<__begin_node_pointer>::pointer_to (__before_begin_);
552+ # else
553+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
554+ return std::addressof (__before_begin_);
555+ } else {
556+ return __begin_node_pointer::pointer_to (*std::addressof (__before_begin_));
557+ }
558+ # endif
516559 }
560+
517561 _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () const _NOEXCEPT {
562+ # ifdef _LIBCPP_CXX03_LANG
518563 return pointer_traits<__begin_node_pointer>::pointer_to (const_cast <__begin_node&>(__before_begin_));
564+ # else
565+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
566+ return const_cast <__begin_node*>(std::addressof (__before_begin_));
567+ } else {
568+ return __begin_node_pointer::pointer_to (*const_cast <__begin_node*>(std::addressof (__before_begin_)));
569+ }
570+ # endif
519571 }
520572
521573 typedef __forward_list_iterator<__node_pointer> iterator;
0 commit comments