https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114400

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
One option would be to make __type_identity_t an alias for type_identity_t in
C++20:

--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -156,13 +156,30 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     using __conditional_t
       = typename __conditional<_Cond>::template type<_If, _Else>;

+#ifdef __cpp_lib_type_identity // C++ >= 20
+  /** * Identity metafunction.
+   * @since C++20
+   * @{
+   */
+  template<typename _Tp>
+    struct type_identity { using type = _Tp; };
+
+  template<typename _Tp>
+    using type_identity_t = typename type_identity<_Tp>::type;
+  /// @}
+
+  template<typename _Tp>
+    using __type_identity_t = type_identity_t<_Tp>;
+  template<typename _Tp>
+    using __type_identity_t = type_identity_t<_Tp>;
+#else
   /// @cond undocumented
   template <typename _Type>
-    struct __type_identity
-    { using type = _Type; };
+    using __type_identity = type_identity<_Type>;

   template<typename _Tp>
     using __type_identity_t = typename __type_identity<_Tp>::type;
+#endif

   namespace __detail
   {
@@ -3600,19 +3617,6 @@ template<typename _Ret, typename _Fn, typename... _Args>
   /// @}
 #endif // __cpp_lib_remove_cvref

-#ifdef __cpp_lib_type_identity // C++ >= 20
-  /** * Identity metafunction.
-   * @since C++20
-   * @{
-   */
-  template<typename _Tp>
-    struct type_identity { using type = _Tp; };
-
-  template<typename _Tp>
-    using type_identity_t = typename type_identity<_Tp>::type;
-  /// @}
-#endif
-
 #ifdef __cpp_lib_unwrap_ref // C++ >= 20
   /** Unwrap a reference_wrapper
    * @since C++20

I don't think we have any uses of __type_identity or __type_identity_t where
this will cause ABI changes. None of the types using __type_identity_t in
constructors are explicitly instantiated in the library.

Reply via email to