Skip to content

Commit 165edc2

Browse files
committed
avoid gcc-13 name mangling bug
1 parent 71b9c4d commit 165edc2

3 files changed

Lines changed: 42 additions & 16 deletions

File tree

include/stdexec/__detail/__config.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -450,17 +450,17 @@ namespace STDEXEC::__std {
450450
#if STDEXEC_HAS_BUILTIN(__remove_reference)
451451
namespace STDEXEC {
452452
template <class Ty>
453-
using _remove_reference_t = __remove_reference(Ty);
453+
using __unref_t = __remove_reference(Ty);
454454
} // namespace STDEXEC
455455

456-
# define STDEXEC_REMOVE_REFERENCE(...) STDEXEC::_remove_reference_t<__VA_ARGS__>
456+
# define STDEXEC_REMOVE_REFERENCE(...) STDEXEC::__unref_t<__VA_ARGS__>
457457
#elif STDEXEC_HAS_BUILTIN(__remove_reference_t)
458458
namespace STDEXEC {
459459
template <class Ty>
460-
using _remove_reference_t = __remove_reference_t(Ty);
460+
using __unref_t = __remove_reference_t(Ty);
461461
} // namespace STDEXEC
462462

463-
# define STDEXEC_REMOVE_REFERENCE(...) STDEXEC::_remove_reference_t<__VA_ARGS__>
463+
# define STDEXEC_REMOVE_REFERENCE(...) STDEXEC::__unref_t<__VA_ARGS__>
464464
#else
465465
# define STDEXEC_REMOVE_REFERENCE(...) ::std::remove_reference_t<__VA_ARGS__>
466466
#endif

include/stdexec/__detail/__sender_introspection.hpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
#include <exception> // IWYU pragma: keep for std::terminate
2626

2727
namespace STDEXEC {
28+
namespace {
29+
template <auto _Descriptor>
30+
struct __sexpr;
31+
} // namespace
32+
2833
namespace __detail {
2934
// A type that describes a sender's metadata
3035
template <class _Tag, class _Data, class... _Child>
@@ -43,10 +48,17 @@ namespace STDEXEC {
4348

4449
template <class _Sender>
4550
using __desc_of = STDEXEC_REMOVE_REFERENCE(_Sender)::__desc_t;
51+
52+
template <class _Sender>
53+
using __tag_of = __desc_of<_Sender>::__tag;
54+
55+
template <class _Sender>
56+
requires __mvalid<__tag_of, _Sender>
57+
extern __tag_of<_Sender> __tag_of_v;
4658
} // namespace __detail
4759

4860
template <class _Sender>
49-
using tag_of_t = __detail::__desc_of<_Sender>::__tag;
61+
using tag_of_t = decltype(__detail::__tag_of_v<_Sender>);
5062

5163
template <class _Sender>
5264
using __data_of = __tuple_element_t<1, _Sender>;
@@ -57,21 +69,26 @@ namespace STDEXEC {
5769
typename __detail::__desc_of<_Sender>::__children
5870
>;
5971

60-
template <class _Ny, class _Sender>
61-
using __nth_child_of = __children_of<_Sender, __mbind_front_q<__m_at, _Ny>>;
62-
6372
template <std::size_t _Ny, class _Sender>
64-
using __nth_child_of_c = __children_of<_Sender, __mbind_front_q<__m_at, __msize_t<_Ny>>>;
73+
using __nth_child_of_c = __tuple_element_t<_Ny + 2, _Sender>;
6574

66-
template <class _Sender>
67-
using __child_of = __children_of<_Sender, __q<__mfront>>;
75+
template <class _Ny, class _Sender>
76+
using __nth_child_of = __nth_child_of_c<_Ny::value, _Sender>;
6877

6978
template <class _Sender>
70-
inline constexpr std::size_t __nbr_children_of = __children_of<_Sender, __msize>::value;
79+
using __child_of = __tuple_element_t<2, _Sender>;
7180

7281
template <class _Sender>
73-
requires __mvalid<tag_of_t, _Sender>
74-
struct __muncurry_<_Sender> : __detail::__desc_of<_Sender> { };
82+
inline constexpr std::size_t __nbr_children_of = __tuple_size_v<_Sender> - 2;
83+
84+
template <auto _Descriptor>
85+
struct __muncurry_<__sexpr<_Descriptor>> : decltype(_Descriptor()){};
86+
87+
template <auto _Descriptor>
88+
struct __muncurry_<__sexpr<_Descriptor> &> : decltype(_Descriptor()){};
89+
90+
template <auto _Descriptor>
91+
struct __muncurry_<__sexpr<_Descriptor> const &> : decltype(_Descriptor()){};
7592

7693
template <class _Sender>
7794
concept sender_expr = __mvalid<tag_of_t, _Sender>;

include/stdexec/__detail/__tuple.hpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,18 @@ namespace STDEXEC {
395395
//
396396
// __tuple_element_t
397397
//
398+
namespace __detail {
399+
template <class _Index, class _Tuple>
400+
using __tuple_element_t = decltype(__tt::__remove_rvalue_reference_fn(
401+
STDEXEC::__get<_Index::value>(__declval<_Tuple>())));
402+
403+
template <size_t _Index, class _Tuple>
404+
requires __mvalid<__tuple_element_t, __msize_t<_Index>, _Tuple>
405+
extern __declfn_t<__tuple_element_t<__msize_t<_Index>, _Tuple>> __tuple_element_v;
406+
} // namespace __detail
407+
398408
template <size_t _Index, class _Tuple>
399-
using __tuple_element_t = decltype(__tt::__remove_rvalue_reference_fn(
400-
STDEXEC::__get<_Index>(__declval<_Tuple>())));
409+
using __tuple_element_t = decltype(__detail::__tuple_element_v<_Index, _Tuple>());
401410

402411
//
403412
// __cat_apply(fn, tups...)

0 commit comments

Comments
 (0)