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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits