@@ -278,18 +278,20 @@ struct __forward_node_traits {
278
278
typedef __rebind_pointer_t <_NodePtr, __begin_node> __begin_node_pointer;
279
279
typedef __rebind_pointer_t <_NodePtr, void > __void_pointer;
280
280
281
- #if defined(_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB)
282
- typedef __begin_node_pointer __iter_node_pointer;
283
- #else
284
- typedef __conditional_t <is_pointer<__void_pointer>::value, __begin_node_pointer, __node_pointer> __iter_node_pointer;
281
+ // TODO(LLVM 22): Remove this check
282
+ #ifndef _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
283
+ static_assert (sizeof (__begin_node_pointer) == sizeof(__node_pointer) && _LIBCPP_ALIGNOF(__begin_node_pointer) ==
284
+ _LIBCPP_ALIGNOF(__node_pointer),
285
+ "It looks like you are using std::forward_list with a fancy pointer type that thas a different "
286
+ "representation depending on whether it points to a forward_list base pointer or a forward_list node "
287
+ "pointer (both of which are implementation details of the standard library). This means that your ABI "
288
+ "is being broken between LLVM 19 and LLVM 20. If you don't care about your ABI being broken, define "
289
+ "the _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB macro to silence this diagnostic.");
285
290
#endif
286
291
287
- typedef __conditional_t <is_same<__iter_node_pointer, __node_pointer>::value, __begin_node_pointer, __node_pointer>
288
- __non_iter_node_pointer;
289
-
290
- _LIBCPP_HIDE_FROM_ABI static __iter_node_pointer __as_iter_node (__iter_node_pointer __p) { return __p; }
291
- _LIBCPP_HIDE_FROM_ABI static __iter_node_pointer __as_iter_node (__non_iter_node_pointer __p) {
292
- return static_cast <__iter_node_pointer>(static_cast <__void_pointer>(__p));
292
+ _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node (__begin_node_pointer __p) { return __p; }
293
+ _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node (__node_pointer __p) {
294
+ return static_cast <__begin_node_pointer>(static_cast <__void_pointer>(__p));
293
295
}
294
296
};
295
297
@@ -351,10 +353,9 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
351
353
typedef __forward_node_traits<_NodePtr> __traits;
352
354
typedef typename __traits::__node_pointer __node_pointer;
353
355
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
354
- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
355
356
typedef typename __traits::__void_pointer __void_pointer;
356
357
357
- __iter_node_pointer __ptr_;
358
+ __begin_node_pointer __ptr_;
358
359
359
360
_LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const {
360
361
return static_cast <__begin_node_pointer>(static_cast <__void_pointer>(__ptr_));
@@ -417,10 +418,9 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
417
418
typedef typename __traits::__node_type __node_type;
418
419
typedef typename __traits::__node_pointer __node_pointer;
419
420
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
420
- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
421
421
typedef typename __traits::__void_pointer __void_pointer;
422
422
423
- __iter_node_pointer __ptr_;
423
+ __begin_node_pointer __ptr_;
424
424
425
425
_LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const {
426
426
return static_cast <__begin_node_pointer>(static_cast <__void_pointer>(__ptr_));
0 commit comments