[clang-doc] Enforce arena allocated types are trivially destructible (#190049)

We can enforce at compile-time that the types we want to place in the
arenas are always safe to allocate there.
This commit is contained in:
Paul Kirth 2026-04-03 14:28:18 -07:00 committed by GitHub
parent c7824ac669
commit 64987a9ccc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -757,6 +757,32 @@ struct ClangDocContext {
bool FTimeTrace; // Indicates if ftime trace is turned on
};
// Ensure arena allocated types remain safe to allocate in the arena.
// Only trivially destructible types are safe, so enforce that at compile-time.
static_assert(std::is_trivially_destructible_v<ConstraintInfo>);
static_assert(std::is_trivially_destructible_v<FieldTypeInfo>);
static_assert(std::is_trivially_destructible_v<Location>);
static_assert(std::is_trivially_destructible_v<Reference>);
static_assert(std::is_trivially_destructible_v<TemplateParamInfo>);
static_assert(std::is_trivially_destructible_v<TypeInfo>);
// FIXME: These types need to be trivially destructible for arena allocation.
static_assert(!std::is_trivially_destructible_v<CommentInfo>);
static_assert(!std::is_trivially_destructible_v<ConceptInfo>);
static_assert(!std::is_trivially_destructible_v<EnumInfo>);
static_assert(!std::is_trivially_destructible_v<FriendInfo>);
static_assert(!std::is_trivially_destructible_v<FunctionInfo>);
static_assert(!std::is_trivially_destructible_v<Info>);
static_assert(!std::is_trivially_destructible_v<MemberTypeInfo>);
static_assert(!std::is_trivially_destructible_v<NamespaceInfo>);
static_assert(!std::is_trivially_destructible_v<RecordInfo>);
static_assert(!std::is_trivially_destructible_v<ScopeChildren>);
static_assert(!std::is_trivially_destructible_v<SymbolInfo>);
static_assert(!std::is_trivially_destructible_v<TemplateInfo>);
static_assert(!std::is_trivially_destructible_v<TemplateSpecializationInfo>);
static_assert(!std::is_trivially_destructible_v<TypedefInfo>);
static_assert(!std::is_trivially_destructible_v<VarInfo>);
} // namespace doc
} // namespace clang