[clang] b1aa3e4 - [clang][diagnostics] Refactor "warn_doc_api_container_decl_mismatch" to use enum_select (#146433)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 9 08:36:52 PDT 2025
Author: Ayokunle Amodu
Date: 2025-07-09T08:36:47-07:00
New Revision: b1aa3e45f23a939d6473592a0449f647ca9cbc7b
URL: https://github.com/llvm/llvm-project/commit/b1aa3e45f23a939d6473592a0449f647ca9cbc7b
DIFF: https://github.com/llvm/llvm-project/commit/b1aa3e45f23a939d6473592a0449f647ca9cbc7b.diff
LOG: [clang][diagnostics] Refactor "warn_doc_api_container_decl_mismatch" to use enum_select (#146433)
Related: https://github.com/llvm/llvm-project/issues/123121
This patch refactors the `warn_doc_api_container_decl_mismatch`
diagnostic to use enum_select instead of select. This gets rid of magic
numbers and improves readability in the caller site.
Added:
Modified:
clang/include/clang/Basic/DiagnosticCommentKinds.td
clang/lib/AST/CommentSema.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticCommentKinds.td b/clang/include/clang/Basic/DiagnosticCommentKinds.td
index 0ce53b395ecee..588cd3615e7e6 100644
--- a/clang/include/clang/Basic/DiagnosticCommentKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommentKinds.td
@@ -84,7 +84,8 @@ def warn_doc_function_method_decl_mismatch : Warning<
InGroup<Documentation>, DefaultIgnore;
def warn_doc_api_container_decl_mismatch : Warning<
- "'%select{\\|@}0%select{class|interface|protocol|struct|union}1' "
+ "'%select{\\|@}0%enum_select<DeclContainerKind>{%Class{class}"
+ "|%Interface{interface}|%Protocol{protocol}|%Struct{struct}|%Union{union}}1' "
"command should not be used in a comment attached to a "
"non-%select{class|interface|protocol|struct|union}2 declaration">,
InGroup<Documentation>, DefaultIgnore;
diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp
index 95f6bf79d118c..88520d7940e34 100644
--- a/clang/lib/AST/CommentSema.cpp
+++ b/clang/lib/AST/CommentSema.cpp
@@ -132,39 +132,42 @@ void Sema::checkContainerDeclVerbatimLine(const BlockCommandComment *Comment) {
const CommandInfo *Info = Traits.getCommandInfo(Comment->getCommandID());
if (!Info->IsRecordLikeDeclarationCommand)
return;
- unsigned DiagSelect;
+ std::optional<unsigned> DiagSelect;
switch (Comment->getCommandID()) {
case CommandTraits::KCI_class:
- DiagSelect =
- (!isClassOrStructOrTagTypedefDecl() && !isClassTemplateDecl()) ? 1
- : 0;
+ if (!isClassOrStructOrTagTypedefDecl() && !isClassTemplateDecl())
+ DiagSelect = diag::DeclContainerKind::Class;
+
// Allow @class command on @interface declarations.
// FIXME. Currently, \class and @class are indistinguishable. So,
// \class is also allowed on an @interface declaration
if (DiagSelect && Comment->getCommandMarker() && isObjCInterfaceDecl())
- DiagSelect = 0;
+ DiagSelect = std::nullopt;
break;
case CommandTraits::KCI_interface:
- DiagSelect = !isObjCInterfaceDecl() ? 2 : 0;
+ if (!isObjCInterfaceDecl())
+ DiagSelect = diag::DeclContainerKind::Interface;
break;
case CommandTraits::KCI_protocol:
- DiagSelect = !isObjCProtocolDecl() ? 3 : 0;
+ if (!isObjCProtocolDecl())
+ DiagSelect = diag::DeclContainerKind::Protocol;
break;
case CommandTraits::KCI_struct:
- DiagSelect = !isClassOrStructOrTagTypedefDecl() ? 4 : 0;
+ if (!isClassOrStructOrTagTypedefDecl())
+ DiagSelect = diag::DeclContainerKind::Struct;
break;
case CommandTraits::KCI_union:
- DiagSelect = !isUnionDecl() ? 5 : 0;
+ if (!isUnionDecl())
+ DiagSelect = diag::DeclContainerKind::Union;
break;
default:
- DiagSelect = 0;
+ DiagSelect = std::nullopt;
break;
}
if (DiagSelect)
Diag(Comment->getLocation(), diag::warn_doc_api_container_decl_mismatch)
- << Comment->getCommandMarker()
- << (DiagSelect-1) << (DiagSelect-1)
- << Comment->getSourceRange();
+ << Comment->getCommandMarker() << (*DiagSelect) << (*DiagSelect)
+ << Comment->getSourceRange();
}
void Sema::checkContainerDecl(const BlockCommandComment *Comment) {
More information about the cfe-commits
mailing list