[llvm-branch-commits] [clang-tools-extra] [clang-doc] Enforce arena allocated types are trivially destructible (PR #190049)
Paul Kirth via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Apr 3 13:24:21 PDT 2026
https://github.com/ilovepi updated https://github.com/llvm/llvm-project/pull/190049
>From 515a8571266cf10d56438acb5b5f5d33cfa89b55 Mon Sep 17 00:00:00 2001
From: Paul Kirth <paulkirth at google.com>
Date: Sat, 21 Mar 2026 02:37:40 +0000
Subject: [PATCH] [clang-doc] Enforce arena allocated types are trivially
destructible
We can enforce at compile-time that the types we want to place in the
arenas are always safe to allocate there.
---
clang-tools-extra/clang-doc/Representation.h | 26 ++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h
index f54d94ba84aaf..aa298f99db1ea 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -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
More information about the llvm-branch-commits
mailing list