34 const SourceManager &SM = *Result.SourceManager;
35 const auto *Function = Result.Nodes.getNodeAs<FunctionDecl>(
"decl");
36 SmallVector<std::pair<const FunctionDecl *, unsigned>, 4> UnnamedParams;
40 const FunctionDecl *Definition =
nullptr;
41 if ((!Function->isDefined(Definition) || Function->isDefaulted() ||
42 Definition->isDefaulted() || Function->isDeleted()) &&
43 (!isa<CXXMethodDecl>(Function) ||
44 cast<CXXMethodDecl>(Function)->size_overridden_methods() == 0))
50 for (
unsigned I = 0, E = Function->getNumParams(); I != E; ++I) {
51 const ParmVarDecl *Parm = Function->getParamDecl(I);
52 if (Parm->isImplicit())
55 if (!Parm->getName().empty())
59 if ((Function->getOverloadedOperator() == OO_PlusPlus ||
60 Function->getOverloadedOperator() == OO_MinusMinus) &&
61 Parm->getType()->isSpecificBuiltinType(BuiltinType::Int))
65 if (!Parm->getLocation().isValid() || Parm->getLocation().isMacroID() ||
66 !SM.isWrittenInSameFile(Parm->getBeginLoc(), Parm->getLocation()))
70 if (
const auto *Typedef = Parm->getType()->getAs<clang::TypedefType>())
71 if (Typedef->getDecl()->getQualifiedNameAsString() ==
"testing::Unused")
75 if (Parm->getType().getCanonicalType()->isNullPtrType())
80 const char *Begin = SM.getCharacterData(Parm->getBeginLoc());
81 const char *End = SM.getCharacterData(Parm->getLocation());
82 StringRef Data(Begin, End - Begin);
83 if (Data.contains(
"/*"))
86 UnnamedParams.push_back(std::make_pair(Function, I));
90 if (!UnnamedParams.empty()) {
91 const ParmVarDecl *FirstParm =
92 UnnamedParams.front().first->getParamDecl(UnnamedParams.front().second);
93 auto D = diag(FirstParm->getLocation(),
94 "all parameters should be named in a function");
96 for (
auto P : UnnamedParams) {
98 static constexpr StringRef FallbackName =
"unused";
99 StringRef NewName = FallbackName;
103 const auto *M = dyn_cast<CXXMethodDecl>(
P.first);
104 if (M && M->size_overridden_methods() > 0) {
105 const ParmVarDecl *OtherParm =
106 (*M->begin_overridden_methods())->getParamDecl(
P.second);
107 StringRef Name = OtherParm->getName();
114 const ParmVarDecl *DefParm = Definition->getParamDecl(
P.second);
115 StringRef Name = DefParm->getName();
123 const ParmVarDecl *Parm =
P.first->getParamDecl(
P.second);
128 const bool IsForwardDeclaration = (!Definition || Function != Definition);
129 if (InsertPlainNamesInForwardDecls && IsForwardDeclaration &&
130 NewName != FallbackName) {
133 D << FixItHint::CreateInsertion(Parm->getLocation(),
134 " " + NewName.str());
136 D << FixItHint::CreateInsertion(Parm->getLocation(),
137 " /*" + NewName.str() +
"*/");
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.