Export of internal Abseil changes
-- c385118b3ef0528d150bfe7aeeb63e77f9e463cd by Matt Calabrese <calabrese@google.com>: Internal-only Archetype generation for testing generic code with user-defined types of various properties. PiperOrigin-RevId: 283833099 -- 4ccf340d3b295aa5b796ee5c97128b61d38899ea by Derek Mauro <dmauro@google.com>: Fixes the flags parse_test. Windows doesn't like consecutive path separators. PiperOrigin-RevId: 283614649 -- 5df6d83acb1e49cd1da785cfaf7551f05149f3c9 by Andy Getzendanner <durandal@google.com>: ABSL_INTERNAL_LOG: forward complete __FILE__ to internal_log_function; not just basename. PiperOrigin-RevId: 283406080 GitOrigin-RevId: c385118b3ef0528d150bfe7aeeb63e77f9e463cd Change-Id: Ib0782354691a73fc40185c3262cfd507085b3393
This commit is contained in:
parent
a4b757b5d4
commit
d659fe54b3
10 changed files with 3112 additions and 43 deletions
|
|
@ -41,8 +41,18 @@
|
|||
|
||||
#include "absl/base/config.h"
|
||||
|
||||
// MSVC constructibility traits do not detect destructor properties and so our
|
||||
// implementations should not use them as a source-of-truth.
|
||||
#if defined(_MSC_VER) && !defined(__clang__) && !defined(__GNUC__)
|
||||
#define ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION 1
|
||||
#endif
|
||||
|
||||
namespace absl {
|
||||
|
||||
// Defined and documented later on in this file.
|
||||
template <typename T>
|
||||
struct is_trivially_destructible;
|
||||
|
||||
// Defined and documented later on in this file.
|
||||
template <typename T>
|
||||
struct is_trivially_move_assignable;
|
||||
|
|
@ -65,6 +75,20 @@ union SingleMemberUnion {
|
|||
#pragma warning(pop)
|
||||
#endif // defined(_MSC_VER) && !defined(__GNUC__)
|
||||
|
||||
template <class T>
|
||||
struct IsTriviallyMoveConstructibleObject
|
||||
: std::integral_constant<
|
||||
bool, std::is_move_constructible<
|
||||
type_traits_internal::SingleMemberUnion<T>>::value &&
|
||||
absl::is_trivially_destructible<T>::value> {};
|
||||
|
||||
template <class T>
|
||||
struct IsTriviallyCopyConstructibleObject
|
||||
: std::integral_constant<
|
||||
bool, std::is_copy_constructible<
|
||||
type_traits_internal::SingleMemberUnion<T>>::value &&
|
||||
absl::is_trivially_destructible<T>::value> {};
|
||||
|
||||
template <class T>
|
||||
struct IsTriviallyMoveAssignableReference : std::false_type {};
|
||||
|
||||
|
|
@ -323,7 +347,9 @@ struct is_trivially_default_constructible
|
|||
: std::integral_constant<bool, __has_trivial_constructor(T) &&
|
||||
std::is_default_constructible<T>::value &&
|
||||
is_trivially_destructible<T>::value> {
|
||||
#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE
|
||||
#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) && \
|
||||
!defined( \
|
||||
ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION)
|
||||
private:
|
||||
static constexpr bool compliant =
|
||||
std::is_trivially_default_constructible<T>::value ==
|
||||
|
|
@ -354,10 +380,11 @@ template <typename T>
|
|||
struct is_trivially_move_constructible
|
||||
: std::conditional<
|
||||
std::is_object<T>::value && !std::is_array<T>::value,
|
||||
std::is_move_constructible<
|
||||
type_traits_internal::SingleMemberUnion<T>>,
|
||||
type_traits_internal::IsTriviallyMoveConstructibleObject<T>,
|
||||
std::is_reference<T>>::type::type {
|
||||
#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE
|
||||
#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) && \
|
||||
!defined( \
|
||||
ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION)
|
||||
private:
|
||||
static constexpr bool compliant =
|
||||
std::is_trivially_move_constructible<T>::value ==
|
||||
|
|
@ -388,10 +415,11 @@ template <typename T>
|
|||
struct is_trivially_copy_constructible
|
||||
: std::conditional<
|
||||
std::is_object<T>::value && !std::is_array<T>::value,
|
||||
std::is_copy_constructible<
|
||||
type_traits_internal::SingleMemberUnion<T>>,
|
||||
type_traits_internal::IsTriviallyCopyConstructibleObject<T>,
|
||||
std::is_lvalue_reference<T>>::type::type {
|
||||
#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE
|
||||
#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) && \
|
||||
!defined( \
|
||||
ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION)
|
||||
private:
|
||||
static constexpr bool compliant =
|
||||
std::is_trivially_copy_constructible<T>::value ==
|
||||
|
|
@ -423,7 +451,8 @@ struct is_trivially_copy_constructible
|
|||
template <typename T>
|
||||
struct is_trivially_move_assignable
|
||||
: std::conditional<
|
||||
std::is_object<T>::value && !std::is_array<T>::value,
|
||||
std::is_object<T>::value && !std::is_array<T>::value &&
|
||||
std::is_move_assignable<T>::value,
|
||||
std::is_move_assignable<type_traits_internal::SingleMemberUnion<T>>,
|
||||
type_traits_internal::IsTriviallyMoveAssignableReference<T>>::type::
|
||||
type {
|
||||
|
|
|
|||
|
|
@ -347,21 +347,6 @@ class Base {
|
|||
virtual ~Base() {}
|
||||
};
|
||||
|
||||
// In GCC/Clang, std::is_trivially_constructible requires that the destructor is
|
||||
// trivial. However, MSVC doesn't require that. This results in different
|
||||
// behavior when checking is_trivially_constructible on any type with
|
||||
// nontrivial destructor. Since absl::is_trivially_default_constructible and
|
||||
// absl::is_trivially_copy_constructible both follows Clang/GCC's interpretation
|
||||
// and check is_trivially_destructible, it results in inconsistency with
|
||||
// std::is_trivially_xxx_constructible on MSVC. This macro is used to work
|
||||
// around this issue in test. In practice, a trivially constructible type
|
||||
// should also be trivially destructible.
|
||||
// GCC bug 51452: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51452
|
||||
// LWG issue 2116: http://cplusplus.github.io/LWG/lwg-active.html#2116
|
||||
#ifndef _MSC_VER
|
||||
#define ABSL_TRIVIALLY_CONSTRUCTIBLE_VERIFY_TRIVIALLY_DESTRUCTIBLE 1
|
||||
#endif
|
||||
|
||||
// Old versions of libc++, around Clang 3.5 to 3.6, consider deleted destructors
|
||||
// as also being trivial. With the resolution of CWG 1928 and CWG 1734, this
|
||||
// is no longer considered true and has thus been amended.
|
||||
|
|
@ -499,11 +484,9 @@ TEST(TypeTraitsTest, TestTrivialDefaultCtor) {
|
|||
EXPECT_FALSE(
|
||||
absl::is_trivially_default_constructible<DeletedDefaultCtor>::value);
|
||||
|
||||
#ifdef ABSL_TRIVIALLY_CONSTRUCTIBLE_VERIFY_TRIVIALLY_DESTRUCTIBLE
|
||||
// types with nontrivial destructor are nontrivial
|
||||
EXPECT_FALSE(
|
||||
absl::is_trivially_default_constructible<NontrivialDestructor>::value);
|
||||
#endif
|
||||
|
||||
// types with vtables
|
||||
EXPECT_FALSE(absl::is_trivially_default_constructible<Base>::value);
|
||||
|
|
@ -607,11 +590,9 @@ TEST(TypeTraitsTest, TestTrivialMoveCtor) {
|
|||
EXPECT_FALSE(
|
||||
absl::is_trivially_move_constructible<NonCopyableOrMovable>::value);
|
||||
|
||||
#ifdef ABSL_TRIVIALLY_CONSTRUCTIBLE_VERIFY_TRIVIALLY_DESTRUCTIBLE
|
||||
// type with nontrivial destructor are nontrivial move construbtible
|
||||
EXPECT_FALSE(
|
||||
absl::is_trivially_move_constructible<NontrivialDestructor>::value);
|
||||
#endif
|
||||
|
||||
// types with vtables
|
||||
EXPECT_FALSE(absl::is_trivially_move_constructible<Base>::value);
|
||||
|
|
@ -682,11 +663,9 @@ TEST(TypeTraitsTest, TestTrivialCopyCtor) {
|
|||
EXPECT_FALSE(
|
||||
absl::is_trivially_copy_constructible<NonCopyableOrMovable>::value);
|
||||
|
||||
#ifdef ABSL_TRIVIALLY_CONSTRUCTIBLE_VERIFY_TRIVIALLY_DESTRUCTIBLE
|
||||
// type with nontrivial destructor are nontrivial copy construbtible
|
||||
EXPECT_FALSE(
|
||||
absl::is_trivially_copy_constructible<NontrivialDestructor>::value);
|
||||
#endif
|
||||
|
||||
// types with vtables
|
||||
EXPECT_FALSE(absl::is_trivially_copy_constructible<Base>::value);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue