diff options
Diffstat (limited to 'absl/meta')
-rw-r--r-- | absl/meta/type_traits.h | 5 | ||||
-rw-r--r-- | absl/meta/type_traits_test.cc | 4 |
2 files changed, 7 insertions, 2 deletions
diff --git a/absl/meta/type_traits.h b/absl/meta/type_traits.h index c3e01fe2990c..8d3264f100db 100644 --- a/absl/meta/type_traits.h +++ b/absl/meta/type_traits.h @@ -263,8 +263,9 @@ struct is_trivially_copy_constructible // `is_trivially_assignable<T&, const T&>`. template <typename T> struct is_trivially_copy_assignable - : std::integral_constant<bool, __has_trivial_assign(T) && - std::is_copy_assignable<T>::value> { + : std::integral_constant< + bool, __has_trivial_assign(typename std::remove_reference<T>::type) && + std::is_copy_assignable<T>::value> { #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE private: static constexpr bool compliant = diff --git a/absl/meta/type_traits_test.cc b/absl/meta/type_traits_test.cc index c44d1c5ff850..9dd95429a5a1 100644 --- a/absl/meta/type_traits_test.cc +++ b/absl/meta/type_traits_test.cc @@ -528,6 +528,10 @@ TEST(TypeTraitsTest, TestTrivialCopyAssign) { // Verify that arrays are not trivially copy assignable using int10 = int[10]; EXPECT_FALSE(absl::is_trivially_copy_assignable<int10>::value); + + // Verify that references are handled correctly + EXPECT_TRUE(absl::is_trivially_copy_assignable<Trivial&&>::value); + EXPECT_TRUE(absl::is_trivially_copy_assignable<Trivial&>::value); } #define ABSL_INTERNAL_EXPECT_ALIAS_EQUIVALENCE(trait_name, ...) \ |