[clang] [APINotes] Early return when no apinotes files are loaded (PR #202727)
Egor Zhdan via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 9 10:53:59 PDT 2026
https://github.com/egorzhdan created https://github.com/llvm/llvm-project/pull/202727
When no APINotes readers are available, let's not spend time trying to determine the current decl's context or do other redundant work.
Resolves https://github.com/llvm/llvm-project/issues/202214
>From b891954bdd923e228c8c7413ed974440f7279dff Mon Sep 17 00:00:00 2001
From: Egor Zhdan <e_zhdan at apple.com>
Date: Tue, 9 Jun 2026 18:52:54 +0100
Subject: [PATCH] [APINotes] Early return when no apinotes files are loaded
When no APINotes readers are available, let's not spend time trying to determine the current decl's context or do other redundant work.
Resolves https://github.com/llvm/llvm-project/issues/202214
---
clang/lib/Sema/SemaAPINotes.cpp | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/clang/lib/Sema/SemaAPINotes.cpp b/clang/lib/Sema/SemaAPINotes.cpp
index e9915bbcc0383..a99408a4c8a7b 100644
--- a/clang/lib/Sema/SemaAPINotes.cpp
+++ b/clang/lib/Sema/SemaAPINotes.cpp
@@ -998,6 +998,9 @@ UnwindTagContext(TagDecl *DC, api_notes::APINotesManager &APINotes) {
void Sema::ProcessAPINotes(Decl *D) {
if (!D)
return;
+ auto Readers = APINotes.findAPINotes(D->getLocation());
+ if (Readers.empty())
+ return;
auto *DC = D->getDeclContext();
// Globals.
@@ -1007,7 +1010,7 @@ void Sema::ProcessAPINotes(Decl *D) {
UnwindNamespaceContext(DC, APINotes);
// Global variables.
if (auto VD = dyn_cast<VarDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info =
Reader->lookupGlobalVariable(VD->getName(), APINotesContext);
ProcessVersionedAPINotes(*this, VD, Info);
@@ -1019,7 +1022,7 @@ void Sema::ProcessAPINotes(Decl *D) {
// Global functions.
if (auto FD = dyn_cast<FunctionDecl>(D)) {
if (FD->getDeclName().isIdentifier()) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info =
Reader->lookupGlobalFunction(FD->getName(), APINotesContext);
ProcessVersionedAPINotes(*this, FD, Info);
@@ -1031,7 +1034,7 @@ void Sema::ProcessAPINotes(Decl *D) {
// Objective-C classes.
if (auto Class = dyn_cast<ObjCInterfaceDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info = Reader->lookupObjCClassInfo(Class->getName());
ProcessVersionedAPINotes(*this, Class, Info);
}
@@ -1041,7 +1044,7 @@ void Sema::ProcessAPINotes(Decl *D) {
// Objective-C protocols.
if (auto Protocol = dyn_cast<ObjCProtocolDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info = Reader->lookupObjCProtocolInfo(Protocol->getName());
ProcessVersionedAPINotes(*this, Protocol, Info);
}
@@ -1083,7 +1086,7 @@ void Sema::ProcessAPINotes(Decl *D) {
T.split(), getASTContext().getPrintingPolicy());
}
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
if (auto ParentTag = dyn_cast<TagDecl>(Tag->getDeclContext()))
APINotesContext = UnwindTagContext(ParentTag, APINotes);
auto Info = Reader->lookupTag(LookupName, APINotesContext);
@@ -1095,7 +1098,7 @@ void Sema::ProcessAPINotes(Decl *D) {
// Typedefs
if (auto Typedef = dyn_cast<TypedefNameDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info = Reader->lookupTypedef(Typedef->getName(), APINotesContext);
ProcessVersionedAPINotes(*this, Typedef, Info);
}
@@ -1108,7 +1111,7 @@ void Sema::ProcessAPINotes(Decl *D) {
if (DC->getRedeclContext()->isFileContext() ||
DC->getRedeclContext()->isExternCContext()) {
if (auto EnumConstant = dyn_cast<EnumConstantDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
auto Info = Reader->lookupEnumConstant(EnumConstant->getName());
ProcessVersionedAPINotes(*this, EnumConstant, Info);
}
@@ -1161,7 +1164,7 @@ void Sema::ProcessAPINotes(Decl *D) {
// Objective-C methods.
if (auto Method = dyn_cast<ObjCMethodDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
if (auto Context = GetContext(Reader)) {
// Map the selector.
Selector Sel = Method->getSelector();
@@ -1206,7 +1209,7 @@ void Sema::ProcessAPINotes(Decl *D) {
if (!isa<CXXConstructorDecl>(CXXMethod) &&
!isa<CXXDestructorDecl>(CXXMethod) &&
!isa<CXXConversionDecl>(CXXMethod)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
if (auto Context = UnwindTagContext(TagContext, APINotes)) {
std::string MethodName;
if (CXXMethod->isOverloadedOperator())
@@ -1225,7 +1228,7 @@ void Sema::ProcessAPINotes(Decl *D) {
if (auto Field = dyn_cast<FieldDecl>(D)) {
if (!Field->isUnnamedBitField() && !Field->isAnonymousStructOrUnion()) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
if (auto Context = UnwindTagContext(TagContext, APINotes)) {
auto Info = Reader->lookupField(Context->id, Field->getName());
ProcessVersionedAPINotes(*this, Field, Info);
@@ -1235,7 +1238,7 @@ void Sema::ProcessAPINotes(Decl *D) {
}
if (auto Tag = dyn_cast<TagDecl>(D)) {
- for (auto Reader : APINotes.findAPINotes(D->getLocation())) {
+ for (auto Reader : Readers) {
if (auto Context = UnwindTagContext(TagContext, APINotes)) {
auto Info = Reader->lookupTag(Tag->getName(), Context);
ProcessVersionedAPINotes(*this, Tag, Info);
More information about the cfe-commits
mailing list