diff --git a/libcudacxx/include/cuda/std/__internal/namespaces.h b/libcudacxx/include/cuda/std/__internal/namespaces.h index b02b986d238..db1c45648b7 100644 --- a/libcudacxx/include/cuda/std/__internal/namespaces.h +++ b/libcudacxx/include/cuda/std/__internal/namespaces.h @@ -24,66 +24,91 @@ // During the header testing, we want to check if the code is wrapped by the prologue/epilogue #if defined(_CCCL_HEADER_TEST) -# define _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() \ +# define _CCCL_PROLOGUE_INCLUDE_CHECK() \ static_assert(_CCCL_PROLOGUE_INCLUDED(), "missing #include "); #else // ^^^ defined(_CCCL_HEADER_TEST) ^^^ / vvv !defined(_CCCL_HEADER_TEST) vvv -# define _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_PROLOGUE_INCLUDE_CHECK() #endif // ^^^ !defined(_CCCL_HEADER_TEST) ^^^ -#define _LIBCUDACXX_CONCAT1(_LIBCUDACXX_X, _LIBCUDACXX_Y) _LIBCUDACXX_X##_LIBCUDACXX_Y -#define _LIBCUDACXX_CONCAT(_LIBCUDACXX_X, _LIBCUDACXX_Y) _LIBCUDACXX_CONCAT1(_LIBCUDACXX_X, _LIBCUDACXX_Y) - #ifndef _LIBCUDACXX_ABI_NAMESPACE -# define _LIBCUDACXX_ABI_NAMESPACE _LIBCUDACXX_CONCAT(__, _LIBCUDACXX_CUDA_ABI_VERSION) +# define _LIBCUDACXX_ABI_NAMESPACE _CCCL_PP_CAT(__, _LIBCUDACXX_CUDA_ABI_VERSION) #endif // _LIBCUDACXX_ABI_NAMESPACE -// clang-format off +#define _CCCL_BEGIN_NAMESPACE_NOVERSION(_NS) \ + _CCCL_PROLOGUE_INCLUDE_CHECK() namespace _NS \ + { +#define _CCCL_END_NAMESPACE_NOVERSION(_NS) \ + } \ + _CCCL_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE(_NS) \ + _CCCL_BEGIN_NAMESPACE_NOVERSION(_NS) inline namespace _LIBCUDACXX_ABI_NAMESPACE \ + { +#define _CCCL_END_NAMESPACE(_NS) \ + } \ + _CCCL_END_NAMESPACE_NOVERSION(_NS) // Standard namespaces with or without versioning -# define _CCCL_BEGIN_NAMESPACE_CUDA_STD_NOVERSION _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std { -# define _CCCL_END_NAMESPACE_CUDA_STD_NOVERSION } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_STD } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_CUDA_STD_NOVERSION _CCCL_BEGIN_NAMESPACE_NOVERSION(cuda::std) +#define _CCCL_END_NAMESPACE_CUDA_STD_NOVERSION _CCCL_END_NAMESPACE_NOVERSION(cuda::std) +#define _CCCL_BEGIN_NAMESPACE_CUDA_STD _CCCL_BEGIN_NAMESPACE(cuda::std) +#define _CCCL_END_NAMESPACE_CUDA_STD _CCCL_END_NAMESPACE(cuda::std) // cuda specific namespaces -# define _CCCL_BEGIN_NAMESPACE_CUDA _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_MR _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::mr { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_MR } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_DEVICE _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::device { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_DEVICE } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_PTX _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::ptx { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_PTX } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_DEVICE_EXPERIMENTAL _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::device::experimental { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_DEVICE_EXPERIMENTAL } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_DRIVER _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::__driver { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_DRIVER } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_CUDA _CCCL_BEGIN_NAMESPACE(cuda) +#define _CCCL_END_NAMESPACE_CUDA _CCCL_END_NAMESPACE(cuda) +#define _CCCL_BEGIN_NAMESPACE_CUDA_MR _CCCL_BEGIN_NAMESPACE(cuda::mr) +#define _CCCL_END_NAMESPACE_CUDA_MR _CCCL_END_NAMESPACE(cuda::mr) +#define _CCCL_BEGIN_NAMESPACE_CUDA_DEVICE _CCCL_BEGIN_NAMESPACE(cuda::device) +#define _CCCL_END_NAMESPACE_CUDA_DEVICE _CCCL_END_NAMESPACE(cuda::device) +#define _CCCL_BEGIN_NAMESPACE_CUDA_PTX _CCCL_BEGIN_NAMESPACE(cuda::ptx) +#define _CCCL_END_NAMESPACE_CUDA_PTX _CCCL_END_NAMESPACE(cuda::ptx) +#define _CCCL_BEGIN_NAMESPACE_CUDA_DEVICE_EXPERIMENTAL _CCCL_BEGIN_NAMESPACE(cuda::device::experimental) +#define _CCCL_END_NAMESPACE_CUDA_DEVICE_EXPERIMENTAL _CCCL_END_NAMESPACE(cuda::device::experimental) +#define _CCCL_BEGIN_NAMESPACE_CUDA_DRIVER _CCCL_BEGIN_NAMESPACE(cuda::__driver) +#define _CCCL_END_NAMESPACE_CUDA_DRIVER _CCCL_END_NAMESPACE(cuda::__driver) // Namespaces related to -# define _CCCL_BEGIN_NAMESPACE_CUDA_STD_RANGES _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std::ranges { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_STD_RANGES } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() -# define _CCCL_BEGIN_NAMESPACE_CUDA_STD_VIEWS _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std::ranges::views { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_STD_VIEWS } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_CUDA_STD_RANGES _CCCL_BEGIN_NAMESPACE(cuda::std::ranges) +#define _CCCL_END_NAMESPACE_CUDA_STD_RANGES _CCCL_END_NAMESPACE(cuda::std::ranges) +#define _CCCL_BEGIN_NAMESPACE_CUDA_STD_VIEWS _CCCL_BEGIN_NAMESPACE(cuda::std::ranges::views) +#define _CCCL_END_NAMESPACE_CUDA_STD_VIEWS _CCCL_END_NAMESPACE(cuda::std::ranges::views) -# define _CCCL_BEGIN_NAMESPACE_CPO(_CPO) namespace _CPO { -# define _CCCL_END_NAMESPACE_CPO } +#define _CCCL_BEGIN_NAMESPACE_CPO(_CPO) \ + namespace _CPO \ + { +#define _CCCL_END_NAMESPACE_CPO } // Namespaces related to chrono / filesystem -# define _CCCL_BEGIN_NAMESPACE_FILESYSTEM _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std { inline namespace __fs { namespace filesystem { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_FILESYSTEM } } } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_FILESYSTEM \ + _CCCL_BEGIN_NAMESPACE_CUDA_STD_NOVERSION \ + inline namespace __fs \ + { \ + namespace filesystem \ + { \ + inline namespace _LIBCUDACXX_ABI_NAMESPACE \ + { +#define _CCCL_END_NAMESPACE_FILESYSTEM \ + } \ + } \ + } \ + _CCCL_END_NAMESPACE_CUDA_STD_NOVERSION // Shorthands for different qualifiers // Namespaces related to execution -# define _CCCL_BEGIN_NAMESPACE_CUDA_STD_EXECUTION _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda::std::execution { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_STD_EXECUTION } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_CUDA_STD_EXECUTION _CCCL_BEGIN_NAMESPACE(cuda::std::execution) +#define _CCCL_END_NAMESPACE_CUDA_STD_EXECUTION _CCCL_END_NAMESPACE(cuda::std::execution) -# define _CCCL_BEGIN_NAMESPACE_CUDA_EXECUTION _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace cuda { namespace execution { inline namespace _LIBCUDACXX_ABI_NAMESPACE { -# define _CCCL_END_NAMESPACE_CUDA_EXECUTION } } } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +#define _CCCL_BEGIN_NAMESPACE_CUDA_EXECUTION _CCCL_BEGIN_NAMESPACE(cuda::execution) +#define _CCCL_END_NAMESPACE_CUDA_EXECUTION _CCCL_END_NAMESPACE(cuda::execution) // Namespace to avoid name collisions with CPOs on clang-16 (see https://godbolt.org/z/9TadonrdM for example) #if _CCCL_COMPILER(CLANG, <=, 16) -# define _LIBCUDACXX_BEGIN_HIDDEN_FRIEND_NAMESPACE namespace __hidden { -# define _LIBCUDACXX_END_HIDDEN_FRIEND_NAMESPACE(_CLASS) } using __hidden::_CLASS; +# define _LIBCUDACXX_BEGIN_HIDDEN_FRIEND_NAMESPACE \ + namespace __hidden \ + { +# define _LIBCUDACXX_END_HIDDEN_FRIEND_NAMESPACE(_CLASS) \ + } \ + using __hidden::_CLASS; #else // ^^^ _CCCL_COMPILER(CLANG, <=, 16) ^^^ / vvv _CCCL_COMPILER(CLANG, >, 16) vvv # define _LIBCUDACXX_BEGIN_HIDDEN_FRIEND_NAMESPACE # define _LIBCUDACXX_END_HIDDEN_FRIEND_NAMESPACE(_CLASS) @@ -93,40 +118,52 @@ # define _CCCL_BEGIN_NAMESPACE_ARCH_DEPENDENT # define _CCCL_END_NAMESPACE_ARCH_DEPENDENT #else // not defined(CCCL_DISABLE_ARCH_DEPENDENT_NAMESPACE) -# if defined(_NVHPC_CUDA) -# define _CCCL_BEGIN_NAMESPACE_ARCH_DEPENDENT \ +# if _CCCL_CUDA_COMPILER(NVHPC) +# define _CCCL_BEGIN_NAMESPACE_ARCH_DEPENDENT \ inline namespace _CCCL_PP_CAT(_CCCL_PP_SPLICE_WITH(_, _SM, NV_TARGET_SM_INTEGER_LIST), _NVHPC) \ { # define _CCCL_END_NAMESPACE_ARCH_DEPENDENT } -# else // not defined(_NVHPC_CUDA) -# define _CCCL_BEGIN_NAMESPACE_ARCH_DEPENDENT \ - inline namespace _CCCL_PP_SPLICE_WITH(_, _SM, __CUDA_ARCH_LIST__) \ +# else // ^^^ _CCCL_CUDA_COMPILER(NVHPC) ^^^ / vvv !_CCCL_CUDA_COMPILER(NVHPC) vvv +# define _CCCL_BEGIN_NAMESPACE_ARCH_DEPENDENT \ + inline namespace _CCCL_PP_SPLICE_WITH(_, _SM, __CUDA_ARCH_LIST__) \ { # define _CCCL_END_NAMESPACE_ARCH_DEPENDENT } -# endif // not defined(_NVHPC_CUDA) +# endif // ^^^ !_CCCL_CUDA_COMPILER(NVHPC) ^^^ #endif // not defined(CCCL_DISABLE_ARCH_DEPENDENT_NAMESPACE) // Host standard library namespaces #if _CCCL_HOST_STD_LIB(LIBSTDCXX) - // We don't appy attributes on forward declarations, so we omit the _GLIBCXX_VISIBILITY(default) +// We don't appy attributes on forward declarations, so we omit the _GLIBCXX_VISIBILITY(default) # if _GLIBCXX_INLINE_VERSION -# define _CCCL_BEGIN_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace std { inline _GLIBCXX_BEGIN_NAMESPACE_VERSION -# define _CCCL_END_NAMESPACE_STD _GLIBCXX_END_NAMESPACE_VERSION } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_BEGIN_NAMESPACE_STD \ + _CCCL_PROLOGUE_INCLUDE_CHECK() namespace std \ + { \ + inline _GLIBCXX_BEGIN_NAMESPACE_VERSION +# define _CCCL_END_NAMESPACE_STD \ + _GLIBCXX_END_NAMESPACE_VERSION \ + } \ + _CCCL_PROLOGUE_INCLUDE_CHECK() # else // ^^^ _GLIBCXX_INLINE_VERSION ^^^ / vvv !_GLIBCXX_INLINE_VERSION vvv -# define _CCCL_BEGIN_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace std { -# define _CCCL_END_NAMESPACE_STD } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_BEGIN_NAMESPACE_STD \ + _CCCL_PROLOGUE_INCLUDE_CHECK() namespace std \ + { +# define _CCCL_END_NAMESPACE_STD \ + } \ + _CCCL_PROLOGUE_INCLUDE_CHECK() # endif // ^^^ !_GLIBCXX_INLINE_VERSION ^^^ #elif _CCCL_HOST_STD_LIB(LIBCXX) -# define _CCCL_BEGIN_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() _LIBCPP_BEGIN_NAMESPACE_STD -# define _CCCL_END_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_BEGIN_NAMESPACE_STD _CCCL_PROLOGUE_INCLUDE_CHECK() _LIBCPP_BEGIN_NAMESPACE_STD +# define _CCCL_END_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD _CCCL_PROLOGUE_INCLUDE_CHECK() #elif _CCCL_HOST_STD_LIB(STL) -# define _CCCL_BEGIN_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() _STD_BEGIN -# define _CCCL_END_NAMESPACE_STD _STD_END _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_BEGIN_NAMESPACE_STD _CCCL_PROLOGUE_INCLUDE_CHECK() _STD_BEGIN +# define _CCCL_END_NAMESPACE_STD _STD_END _CCCL_PROLOGUE_INCLUDE_CHECK() #else -# define _CCCL_BEGIN_NAMESPACE_STD _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() namespace std { -# define _CCCL_END_NAMESPACE_STD } _LIBCUDACXX_PROLOGUE_INCLUDE_CHECK() +# define _CCCL_BEGIN_NAMESPACE_STD \ + _CCCL_PROLOGUE_INCLUDE_CHECK() namespace std \ + { +# define _CCCL_END_NAMESPACE_STD \ + } \ + _CCCL_PROLOGUE_INCLUDE_CHECK() #endif -// clang-format on - #endif // _CUDA_STD___INTERNAL_NAMESPACES_H