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

Reply via email to