https://github.com/dingxiangfei2009 created 
https://github.com/llvm/llvm-project/pull/164806

`cppcoreguidelines-macro-usage` lint incorrectly identifies these macros as 
candidates for rewrite into template arguments. There are no, variadic or not, 
equivalent to these macros using templated functions.

In short, we should not suggest code writers to rewrite this macro with 
`constexpr` functions.

```
#define FORMAT_STR(format_msg, first_idx) __attribute__((format(printf, 
format_msg, first_idx)))
```

>From 61b53401891fbd43526324b86343d4975edb1b71 Mon Sep 17 00:00:00 2001
From: Xiangfei Ding <[email protected]>
Date: Thu, 23 Oct 2025 11:39:21 +0000
Subject: [PATCH] [clang-tidy] Do not lint on attribute macros

cppcoreguidelines-macro-usage lint incorrectly identifies these macros
as candidates for rewrite into template arguments.
There are no, variadic or not, equivalent to these macros using
templated functions.

Signed-off-by: Xiangfei Ding <[email protected]>
---
 .../clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp  | 11 +++++++++--
 .../checkers/cppcoreguidelines/macro-usage.cpp        |  2 ++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp 
b/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp
index 766cae45f15b5..8370e51284867 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp
@@ -82,6 +82,13 @@ void MacroUsageCheck::registerPPCallbacks(const 
SourceManager &SM,
 void MacroUsageCheck::warnMacro(const MacroDirective *MD, StringRef MacroName) 
{
   const MacroInfo *Info = MD->getMacroInfo();
   StringRef Message;
+  bool PossiblyNotFunctionLike;
+  if (Info->getNumTokens() > 0) {
+    const Token &Tok = Info->getReplacementToken(0);
+    PossiblyNotFunctionLike = Tok.is(tok::kw___attribute);
+  } else {
+    PossiblyNotFunctionLike = false;
+  }
 
   if (llvm::all_of(Info->tokens(), std::mem_fn(&Token::isLiteral)))
     Message = "macro '%0' used to declare a constant; consider using a "
@@ -89,10 +96,10 @@ void MacroUsageCheck::warnMacro(const MacroDirective *MD, 
StringRef MacroName) {
   // A variadic macro is function-like at the same time. Therefore variadic
   // macros are checked first and will be excluded for the function-like
   // diagnostic.
-  else if (Info->isVariadic())
+  else if (Info->isVariadic() && !PossiblyNotFunctionLike)
     Message = "variadic macro '%0' used; consider using a 'constexpr' "
               "variadic template function";
-  else if (Info->isFunctionLike())
+  else if (Info->isFunctionLike() && !PossiblyNotFunctionLike)
     Message = "function-like macro '%0' used; consider a 'constexpr' template "
               "function";
 
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/macro-usage.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/macro-usage.cpp
index 865ef9df1182e..f3eb8185878f2 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/macro-usage.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/macro-usage.cpp
@@ -47,4 +47,6 @@
 #define DLLEXPORTS __declspec(dllimport)
 #endif
 
+#define ATTRIBUTE_MACRO(...) __attribute__(__VA_ARGS__)
+
 #endif

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to