[libcxx-commits] [PATCH] D76636: [RFC] Added type trait to remove address space qualifier from type

Anastasia Stulova via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 23 12:00:59 PDT 2020


Anastasia created this revision.
Anastasia added reviewers: mclow.lists, ldionne, EricWF.
Herald added a subscriber: dexonsmith.

As I am not developing `libcxx`, I am not familiar with the process. However, I was wondering if it makes sense to add the following feature.

Clang provides experimental support for address spaces in C++ mode that are represented as type qualifiers (following ISO/IEC JTC1 SC22 WG14 N1169 Section 5.1.2). It would be convenient to have a utility to remove address space from the type just like other qualifiers e.g. `remove_cv`.

It is not part of any official spec and therefore I am adding double underscore prefix to the name. Also the feature is guarded on the compilation with Clang since address spaces in C++ is currently just a Clang extension.

The need for this feature has been discussed in:
https://llvm.org/PR42033
https://reviews.llvm.org/D69938#1745766

Any feedback is valuable!


https://reviews.llvm.org/D76636

Files:
  libcxx/include/type_traits
  libcxx/test/libcxx/type_traits/address_space.pass.cpp


Index: libcxx/test/libcxx/type_traits/address_space.pass.cpp
===================================================================
--- /dev/null
+++ libcxx/test/libcxx/type_traits/address_space.pass.cpp
@@ -0,0 +1,22 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+
+#include <type_traits>
+#ifdef __clang__
+typedef int __attribute__((address_space(2))) intAS2;
+
+void foo(){
+  std::__remove_address_space<intAS2> i;
+  (void)i;
+}
+#endif
+
+int main(int, char**) {
+  return 0;
+}
Index: libcxx/include/type_traits
===================================================================
--- libcxx/include/type_traits
+++ libcxx/include/type_traits
@@ -65,6 +65,11 @@
     template <class T> struct add_volatile;
     template <class T> struct add_cv;
 
+#ifdef __clang__
+    // Remove address space from type.
+    template <class T> struct __remove_address_space;
+#endif
+
     // Reference transformations:
     template <class T> struct remove_reference;
     template <class T> struct add_lvalue_reference;
@@ -700,6 +705,14 @@
 template <class _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
 #endif
 
+#ifdef __clang__
+// __remove_address_space
+
+template<class... T> struct __remove_address_space;
+template <class _Tp> struct __remove_address_space<_Tp> { typedef _Tp type; };
+template <class _Tp, int I> struct __remove_address_space<_Tp __attribute__((address_space(I)))> { typedef _Tp __attribute__((address_space(I))) type; };
+#endif
+
 // is_void
 
 template <class _Tp> struct __libcpp_is_void       : public false_type {};


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76636.252097.patch
Type: text/x-patch
Size: 1888 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20200323/cf53600a/attachment.bin>


More information about the libcxx-commits mailing list