@@ -278,18 +278,20 @@ struct __forward_node_traits {
278278 typedef __rebind_pointer_t <_NodePtr, __begin_node> __begin_node_pointer;
279279 typedef __rebind_pointer_t <_NodePtr, void > __void_pointer;
280280
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.");
285290#endif
286291
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));
293295 }
294296};
295297
@@ -351,10 +353,9 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
351353 typedef __forward_node_traits<_NodePtr> __traits;
352354 typedef typename __traits::__node_pointer __node_pointer;
353355 typedef typename __traits::__begin_node_pointer __begin_node_pointer;
354- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
355356 typedef typename __traits::__void_pointer __void_pointer;
356357
357- __iter_node_pointer __ptr_;
358+ __begin_node_pointer __ptr_;
358359
359360 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const {
360361 return static_cast <__begin_node_pointer>(static_cast <__void_pointer>(__ptr_));
@@ -417,10 +418,9 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
417418 typedef typename __traits::__node_type __node_type;
418419 typedef typename __traits::__node_pointer __node_pointer;
419420 typedef typename __traits::__begin_node_pointer __begin_node_pointer;
420- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
421421 typedef typename __traits::__void_pointer __void_pointer;
422422
423- __iter_node_pointer __ptr_;
423+ __begin_node_pointer __ptr_;
424424
425425 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const {
426426 return static_cast <__begin_node_pointer>(static_cast <__void_pointer>(__ptr_));
0 commit comments