diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -304,6 +304,8 @@ - GNU attributes being applied prior to standard attributes would be handled improperly, which was corrected to match the behaviour exhibited by GCC. `Issue 58229 `_ +- The builtin type trait ``__is_aggregate`` now returns ``true`` for arrays of incomplete + types in accordance with the suggested fix for `LWG3823 https://cplusplus.github.io/LWG/issue3823`_ Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4874,9 +4874,16 @@ Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); return true; + // LWG3823: T shall be an array type, a complete type, or cv void. + case UTT_IsAggregate: + if (ArgTy->isArrayType() || ArgTy->isVoidType()) + return true; + + return !S.RequireCompleteType( + Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); + // C++1z [meta.unary.prop]: // remove_all_extents_t shall be a complete type or cv void. - case UTT_IsAggregate: case UTT_IsTrivial: case UTT_IsTriviallyCopyable: case UTT_IsStandardLayout: diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp --- a/clang/test/SemaCXX/type-traits.cpp +++ b/clang/test/SemaCXX/type-traits.cpp @@ -533,13 +533,15 @@ constexpr bool TrueAfterCpp14 = __cplusplus > 201402L; __is_aggregate(AnIncompleteType); // expected-error {{incomplete type}} - __is_aggregate(AnIncompleteType[]); // expected-error {{incomplete type}} - __is_aggregate(AnIncompleteType[1]); // expected-error {{incomplete type}} - __is_aggregate(AnIncompleteTypeAr); // expected-error {{incomplete type}} - __is_aggregate(AnIncompleteTypeArNB); // expected-error {{incomplete type}} - __is_aggregate(AnIncompleteTypeArMB); // expected-error {{incomplete type}} __is_aggregate(IncompleteUnion); // expected-error {{incomplete type}} + // Valid since LWG3823 + static_assert(__is_aggregate(AnIncompleteType[]), ""); + static_assert(__is_aggregate(AnIncompleteType[1]), ""); + static_assert(__is_aggregate(AnIncompleteTypeAr), ""); + static_assert(__is_aggregate(AnIncompleteTypeArNB), ""); + static_assert(__is_aggregate(AnIncompleteTypeArMB), ""); + static_assert(!__is_aggregate(NonPOD), ""); static_assert(__is_aggregate(NonPODAr), ""); static_assert(__is_aggregate(NonPODArNB), "");