https://github.com/xxxxbc updated https://github.com/llvm/llvm-project/pull/208730
>From 2cf1d6a56b7936b7a532e387b705b81b889adc18 Mon Sep 17 00:00:00 2001 From: hehuan <[email protected]> Date: Fri, 10 Jul 2026 21:10:09 +0800 Subject: [PATCH] [clang-tidy] Ignore standard tag dispatch types in readability-named-parameter The readability-named-parameter check warned on unnamed parameters whose types are standard tag dispatch types. These types are used exclusively for overload resolution, so requiring a name for them only adds noise. Add the TagDispatchTypes option with a comprehensive default list of standard tag dispatch types (std::in_place_t, std::allocator_arg_t, std::nothrow_t, std::piecewise_construct_t, std::defer_lock_t, std::try_to_lock_t, std::default_sentinel_t, std::from_range_t, std::sorted_unique_t, std::sorted_equivalent_t, std::nostopstate_t, std::unexpect_t). Users can customize the list to add their own tag types. Fixes #208448. --- .../readability/NamedParameterCheck.cpp | 27 ++++++++++++++++++- .../readability/NamedParameterCheck.h | 1 + clang-tools-extra/docs/ReleaseNotes.rst | 7 +++++ .../checks/readability/named-parameter.rst | 12 +++++++++ .../checkers/readability/named-parameter.cpp | 26 ++++++++++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.cpp b/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.cpp index c457d682a1787..d256fcc96be96 100644 --- a/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "NamedParameterCheck.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" @@ -19,11 +20,26 @@ NamedParameterCheck::NamedParameterCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), InsertPlainNamesInForwardDecls( - Options.get("InsertPlainNamesInForwardDecls", false)) {} + Options.get("InsertPlainNamesInForwardDecls", false)), + TagDispatchTypes(utils::options::parseStringList( + Options.get("TagDispatchTypes", "std::allocator_arg_t;" + "std::defer_lock_t;" + "std::default_sentinel_t;" + "std::from_range_t;" + "std::in_place_t;" + "std::nothrow_t;" + "std::nostopstate_t;" + "std::piecewise_construct_t;" + "std::sorted_equivalent_t;" + "std::sorted_unique_t;" + "std::try_to_lock_t;" + "std::unexpect_t"))) {} void NamedParameterCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "InsertPlainNamesInForwardDecls", InsertPlainNamesInForwardDecls); + Options.store(Opts, "TagDispatchTypes", + utils::options::serializeStringList(TagDispatchTypes)); } void NamedParameterCheck::registerMatchers(ast_matchers::MatchFinder *Finder) { @@ -75,6 +91,15 @@ void NamedParameterCheck::check(const MatchFinder::MatchResult &Result) { if (Parm->getType().getCanonicalType()->isNullPtrType()) continue; + // Skip standard tag dispatch types used exclusively for overload + // resolution. + if (const auto *Record = + Parm->getType().getCanonicalType()->getAsCXXRecordDecl()) { + const std::string QName = Record->getQualifiedNameAsString(); + if (llvm::is_contained(TagDispatchTypes, QName)) + continue; + } + // Look for comments. We explicitly want to allow idioms like // void foo(int /*unused*/) const char *Begin = SM.getCharacterData(Parm->getBeginLoc()); diff --git a/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.h b/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.h index ecd128d887f84..aa10b1e5ff99b 100644 --- a/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.h +++ b/clang-tools-extra/clang-tidy/readability/NamedParameterCheck.h @@ -36,6 +36,7 @@ class NamedParameterCheck : public ClangTidyCheck { private: const bool InsertPlainNamesInForwardDecls; + const std::vector<StringRef> TagDispatchTypes; }; } // namespace clang::tidy::readability diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 082cc5cb78bc0..2086b91e11191 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -854,6 +854,13 @@ Changes in existing checks <clang-tidy/checks/readability/inconsistent-ifelse-braces>` check to correctly handle labeled statements of ``if``/``else`` bodies. +- Improved :doc:`readability-named-parameter + <clang-tidy/checks/readability/named-parameter>` check by ignoring + standard tag dispatch types (e.g. ``std::in_place_t``, + ``std::allocator_arg_t``, ``std::nothrow_t``) that are used exclusively for + overload resolution. Added the :option:`TagDispatchTypes` option to allow + customizing the set of ignored types. + - Improved :doc:`readability-non-const-parameter <clang-tidy/checks/readability/non-const-parameter>` check: diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/named-parameter.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/named-parameter.rst index 0dd25e23fc653..e3a63f7b58672 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/readability/named-parameter.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/readability/named-parameter.rst @@ -25,6 +25,11 @@ function definition. Corresponding cpplint.py check name: `readability/function`. +The check ignores parameters whose types are standard tag dispatch types used +exclusively for overload resolution (e.g., ``std::in_place_t``, +``std::allocator_arg_t``, ``std::nothrow_t``). The set of ignored types can be +customized with the :option:`TagDispatchTypes` option. + Options ------- @@ -33,3 +38,10 @@ Options If set to `true`, the check will insert parameter names without comments for forward declarations only. Otherwise, the check will insert parameter names as comments (e.g., ``/*param*/``). Default is `false`. + +.. option:: TagDispatchTypes + + A semicolon-separated list of fully-qualified type names that should be + treated as tag dispatch types. Parameters of these types are not required to + be named. Default is + ``std::allocator_arg_t;std::defer_lock_t;std::default_sentinel_t;std::from_range_t;std::in_place_t;std::nothrow_t;std::nostopstate_t;std::piecewise_construct_t;std::sorted_equivalent_t;std::sorted_unique_t;std::try_to_lock_t;std::unexpect_t``. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/named-parameter.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/named-parameter.cpp index 8ae0d7055867b..a4204423060d0 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/named-parameter.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/named-parameter.cpp @@ -161,10 +161,36 @@ void MockFunction(Unused, int q, Unused) { namespace std { typedef decltype(nullptr) nullptr_t; +struct allocator_arg_t {}; +struct defer_lock_t {}; +struct default_sentinel_t {}; +struct from_range_t {}; +struct in_place_t {}; +struct nothrow_t {}; +struct nostopstate_t {}; +struct piecewise_construct_t {}; +struct sorted_equivalent_t {}; +struct sorted_unique_t {}; +struct try_to_lock_t {}; +struct unexpect_t {}; } void f(std::nullptr_t) {} +// Standard tag dispatch types should not trigger warnings. +void f_in_place(std::in_place_t) {} +void f_allocator_arg(std::allocator_arg_t) {} +void f_default_sentinel(std::default_sentinel_t) {} +void f_nothrow(std::nothrow_t) {} +void f_piecewise(std::piecewise_construct_t) {} +void f_defer_lock(std::defer_lock_t) {} +void f_try_to_lock(std::try_to_lock_t) {} +void f_from_range(std::from_range_t) {} +void f_sorted_unique(std::sorted_unique_t) {} +void f_sorted_equivalent(std::sorted_equivalent_t) {} +void f_nostopstate(std::nostopstate_t) {} +void f_unexpect(std::unexpect_t) {} + typedef void (F)(int); F f; void f(int x) {} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
