Skip to content

Commit b6fd6de

Browse files
committed
Fix constant evaluation due to non-constant pointer_traits::pointer_to for gcc
1 parent 3d213b1 commit b6fd6de

File tree

1 file changed

+61
-9
lines changed

1 file changed

+61
-9
lines changed

libcxx/include/forward_list

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
359376
class __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

Comments
 (0)