This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [C++ PATCH, RFC] Implement new C++ intrinsics __is_assignable and __is_constructible.


On 17/05/17 15:15 +0300, Ville Voutilainen wrote:
One more round. This patch doesn't change any of the compiler bits,
but the llvm testsuite revealed
that we didn't handle things like
is_trivially_copy_constructible<void> properly, so I needed to adjust
the library implementation of the triviality-traits. Now we pass the
llvm testsuite for these traits,
and this patch passes our full testsuite.

Jonathan, ok for trunk?

Yes OK, thanks.

A few observations ...

@@ -1405,45 +1185,95 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
  { };

  /// is_trivially_copy_constructible
+
+  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
+    struct __is_trivially_copy_constructible_impl;
+
  template<typename _Tp>
-    struct is_trivially_copy_constructible
+    struct __is_trivially_copy_constructible_impl<_Tp, false>
+    : public false_type { };
+
+  template<typename _Tp>
+    struct __is_trivially_copy_constructible_impl<_Tp, true>
    : public __and_<is_copy_constructible<_Tp>,
		    integral_constant<bool,
			__is_trivially_constructible(_Tp, const _Tp&)>>
    { };

This could use __bool_constant, and there doesn't seem to be any
advantage to using __and_ here, because there's nothing to
short-circuit. So:

   : public __bool_constant<is_copy_constructible<_Tp>::value
		    && __is_trivially_constructible(_Tp, const _Tp&)>

But that was pre-existing, so let's deal with that
separately.

+  template<typename _Tp>
+    struct __is_trivially_move_constructible_impl<_Tp, true>
    : public __and_<is_move_constructible<_Tp>,
		    integral_constant<bool,
			__is_trivially_constructible(_Tp, _Tp&&)>>
    { };

Ditto.

+  template<typename _Tp>
+    struct __is_trivially_copy_assignable_impl<_Tp, true>
    : public __and_<is_copy_assignable<_Tp>,
		    integral_constant<bool,
			__is_trivially_assignable(_Tp&, const _Tp&)>>
    { };

Ditto.

+  template<typename _Tp>
+    struct __is_trivially_move_assignable_impl<_Tp, true>
    : public __and_<is_move_assignable<_Tp>,
		    integral_constant<bool,
			__is_trivially_assignable(_Tp&, _Tp&&)>>

Ditto.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]