Use __is_same_as for std::is_same and std::is_same_v
authorJonathan Wakely <jwakely@redhat.com>
Fri, 11 Oct 2019 15:53:44 +0000 (16:53 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 11 Oct 2019 15:53:44 +0000 (16:53 +0100)
By using the built-in we don't need to match a partial specialization
for std::is_same and don't need to instantiate std::is_same at all for
uses of std::is_same_v.

* include/std/type_traits (is_same): Replace partial specialization
by using __is_same_as built-in in primary template.
(is_same_v): Use __is_same_as built-in instead of instantiating the
is_same trait.

From-SVN: r276891

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits

index 3e6a7ddb539b9739e3a51da67d526b5af0137190..4b1b010ae97c7da1a00711a1f16e4615f12dbb64 100644 (file)
@@ -1,5 +1,10 @@
 2019-10-11  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/std/type_traits (is_same): Replace partial specialization
+       by using __is_same_as built-in in primary template.
+       (is_same_v): Use __is_same_as built-in instead of instantiating the
+       is_same trait.
+
        PR libstdc++/92059
        * include/tr2/dynamic_bitset (__dynamic_bitset_base): Define all
        special member functions as defaulted. Add noexcept to most members.
index dc8a019324de93b9892475efb51ccc0433ad0b66..4de5daa9f063af583da3519885852c509cf0814c 100644 (file)
@@ -1388,13 +1388,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Type relations.
 
   /// is_same
-  template<typename, typename>
+  template<typename _Tp, typename _Up>
     struct is_same
-    : public false_type { };
-
-  template<typename _Tp>
-    struct is_same<_Tp, _Tp>
-    : public true_type { };
+    : public integral_constant<bool, __is_same_as(_Tp, _Up)>
+    { };
 
   /// is_base_of
   template<typename _Base, typename _Derived>
@@ -3158,7 +3155,7 @@ template <typename _Tp>
 template <typename _Tp, unsigned _Idx = 0>
   inline constexpr size_t extent_v = extent<_Tp, _Idx>::value;
 template <typename _Tp, typename _Up>
-  inline constexpr bool is_same_v = is_same<_Tp, _Up>::value;
+  inline constexpr bool is_same_v = __is_same_as(_Tp, _Up);
 template <typename _Base, typename _Derived>
   inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
 template <typename _From, typename _To>