Implement LWG-3823 Unnecessary precondition for `is_aggregate` (workaround) (#3231)

Co-authored-by: Casey Carter <Casey@Carter.net>
This commit is contained in:
A. Jiang 2022-11-19 07:42:53 +08:00 коммит произвёл GitHub
Родитель 009881898c
Коммит 2127d8b47b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 17 добавлений и 1 удалений

Просмотреть файл

@ -615,11 +615,22 @@ struct has_unique_object_representations : bool_constant<__has_unique_object_rep
_EXPORT_STD template <class _Ty>
_INLINE_VAR constexpr bool has_unique_object_representations_v = __has_unique_object_representations(_Ty);
#if 1 // TRANSITION, DevCom-10201896 and LLVM-59002
template <class _Ty>
struct _Is_aggregate_impl : bool_constant<__is_aggregate(_Ty)> {};
_EXPORT_STD template <class _Ty>
struct is_aggregate : bool_constant<__is_aggregate(_Ty)> {}; // determine whether _Ty is an aggregate
_INLINE_VAR constexpr bool is_aggregate_v = disjunction_v<is_array<_Ty>, _Is_aggregate_impl<_Ty>>;
_EXPORT_STD template <class _Ty>
struct is_aggregate : bool_constant<is_aggregate_v<_Ty>> {};
#else // ^^^ workaround / no workaround vvv
_EXPORT_STD template <class _Ty>
struct is_aggregate : bool_constant<__is_aggregate(_Ty)> {};
_EXPORT_STD template <class _Ty>
_INLINE_VAR constexpr bool is_aggregate_v = __is_aggregate(_Ty);
#endif // ^^^ no workaround ^^^
#endif // _HAS_CXX17
_EXPORT_STD template <class _Ty, class... _Args>

Просмотреть файл

@ -234,6 +234,8 @@ STATIC_ASSERT(!is_aggregate_v<NonAggVirtualBaseFunc>);
struct NonAggVirtualBaseIndirect : NonAggVirtualBase {};
STATIC_ASSERT(!is_aggregate_v<NonAggVirtualBaseIndirect>);
struct Incomplete;
STATIC_ASSERT(is_aggregate_v<int[10]>);
STATIC_ASSERT(is_aggregate_v<int[]>);
STATIC_ASSERT(is_aggregate_v<Cxx14Agg[]>);
@ -242,11 +244,14 @@ STATIC_ASSERT(is_aggregate_v<NonAggDefaultCtor[]>);
STATIC_ASSERT(is_aggregate_v<int* [10]>);
STATIC_ASSERT(is_aggregate_v<NonAggDefaultCtor[2][3]>);
STATIC_ASSERT(is_aggregate_v<Empty[10]>);
STATIC_ASSERT(is_aggregate_v<Incomplete[]>);
STATIC_ASSERT(is_aggregate_v<Incomplete[10]>);
STATIC_ASSERT(!is_aggregate_v<int&>);
STATIC_ASSERT(!is_aggregate_v<const int*>);
STATIC_ASSERT(!is_aggregate_v<const Cxx14Agg&>);
STATIC_ASSERT(!is_aggregate_v<Cxx14Agg*>);
STATIC_ASSERT(!is_aggregate_v<Incomplete*>);
template <typename T>
struct AggTemplateClass {