diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index c51f655..3eb9eb9 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -3037,7 +3037,8 @@
   Foo& operator=(const Foo&) = default;
   Foo& operator=(Foo&&) = default;
 
-  template <typename _Tp, std::enable_if_t<_not_self<_Tp>, int> = 0>
+  template <typename _Tp, typename = std::enable_if_t<_not_self<_Tp>>>
+  // NOLINTNEXTLINE(google-explicit-constructor)
   constexpr Foo(_Tp&& _arg)
       : _value(std::forward<_Tp>(_arg)) {}
 
@@ -3121,17 +3122,32 @@
   case ns: {
     ::std::vector<int32_t> _aidl_value;
     if ((_aidl_ret_status = _aidl_parcel->readInt32Vector(&_aidl_value)) != ::android::OK) return _aidl_ret_status;
-    set<ns>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<::std::vector<int32_t>>) {
+      set<ns>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<ns>(std::move(_aidl_value));
+    }
     return ::android::OK; }
   case e: {
     ::a::ByteEnum _aidl_value;
     if ((_aidl_ret_status = _aidl_parcel->readByte(reinterpret_cast<int8_t *>(&_aidl_value))) != ::android::OK) return _aidl_ret_status;
-    set<e>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<::a::ByteEnum>) {
+      set<e>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<e>(std::move(_aidl_value));
+    }
     return ::android::OK; }
   case pfd: {
     ::android::os::ParcelFileDescriptor _aidl_value;
     if ((_aidl_ret_status = _aidl_parcel->readParcelable(&_aidl_value)) != ::android::OK) return _aidl_ret_status;
-    set<pfd>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<::android::os::ParcelFileDescriptor>) {
+      set<pfd>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<pfd>(std::move(_aidl_value));
+    }
     return ::android::OK; }
   }
   return ::android::BAD_VALUE;
@@ -3192,7 +3208,8 @@
   Foo& operator=(const Foo&) = default;
   Foo& operator=(Foo&&) = default;
 
-  template <typename _Tp, std::enable_if_t<_not_self<_Tp>, int> = 0>
+  template <typename _Tp, typename = std::enable_if_t<_not_self<_Tp>>>
+  // NOLINTNEXTLINE(google-explicit-constructor)
   constexpr Foo(_Tp&& _arg)
       : _value(std::forward<_Tp>(_arg)) {}
 
@@ -3277,17 +3294,32 @@
   case ns: {
     std::vector<int32_t> _aidl_value;
     if ((_aidl_ret_status = ::ndk::AParcel_readVector(_parcel, &_aidl_value)) != STATUS_OK) return _aidl_ret_status;
-    set<ns>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<std::vector<int32_t>>) {
+      set<ns>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<ns>(std::move(_aidl_value));
+    }
     return STATUS_OK; }
   case e: {
     ::aidl::a::ByteEnum _aidl_value;
     if ((_aidl_ret_status = AParcel_readByte(_parcel, reinterpret_cast<int8_t*>(&_aidl_value))) != STATUS_OK) return _aidl_ret_status;
-    set<e>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<::aidl::a::ByteEnum>) {
+      set<e>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<e>(std::move(_aidl_value));
+    }
     return STATUS_OK; }
   case pfd: {
     ::ndk::ScopedFileDescriptor _aidl_value;
     if ((_aidl_ret_status = ::ndk::AParcel_readRequiredParcelFileDescriptor(_parcel, &_aidl_value)) != STATUS_OK) return _aidl_ret_status;
-    set<pfd>(std::move(_aidl_value));
+    if constexpr (std::is_trivially_copyable_v<::ndk::ScopedFileDescriptor>) {
+      set<pfd>(_aidl_value);
+    } else {
+      // NOLINTNEXTLINE(performance-move-const-arg)
+      set<pfd>(std::move(_aidl_value));
+    }
     return STATUS_OK; }
   }
   return STATUS_BAD_VALUE;
