67 const SourceManager &SM = *Result.SourceManager;
68 const auto *Function = Result.Nodes.getNodeAs<FunctionDecl>(
"decl");
73 const FunctionDecl *Definition =
nullptr;
74 if ((!Function->isDefined(Definition) || Function->isDefaulted() ||
75 Definition->isDefaulted() || Function->isDeleted()) &&
76 (!isa<CXXMethodDecl>(Function) ||
77 cast<CXXMethodDecl>(Function)->size_overridden_methods() == 0))
83 for (
unsigned I = 0, E = Function->getNumParams(); I != E; ++I) {
84 const ParmVarDecl *Parm = Function->getParamDecl(I);
85 if (Parm->isImplicit())
88 if (!Parm->getName().empty())
92 if ((Function->getOverloadedOperator() == OO_PlusPlus ||
93 Function->getOverloadedOperator() == OO_MinusMinus) &&
94 Parm->getType()->isSpecificBuiltinType(BuiltinType::Int))
98 if (!Parm->getLocation().isValid() || Parm->getLocation().isMacroID() ||
99 !SM.isWrittenInSameFile(Parm->getBeginLoc(), Parm->getLocation()))
103 if (
const auto *Typedef = Parm->getType()->getAs<TypedefType>();
105 Typedef->getDecl()->getQualifiedNameAsString() ==
"testing::Unused")
109 if (Parm->getType().getCanonicalType()->isNullPtrType())
114 if (
const auto *Record =
115 Parm->getType().getCanonicalType()->getAsCXXRecordDecl()) {
116 const std::string QName = Record->getQualifiedNameAsString();
117 if (llvm::is_contained(IgnoredTypes, QName))
123 const char *Begin = SM.getCharacterData(Parm->getBeginLoc());
124 const char *End = SM.getCharacterData(Parm->getLocation());
125 const StringRef Data(Begin, End - Begin);
126 if (Data.contains(
"/*"))
129 UnnamedParams.emplace_back(Function, I);
133 if (!UnnamedParams.empty()) {
134 const ParmVarDecl *FirstParm =
135 UnnamedParams.front().first->getParamDecl(UnnamedParams.front().second);
136 const auto D = diag(FirstParm->getLocation(),
137 "all parameters should be named in a function");
139 for (
const auto P : UnnamedParams) {
141 static constexpr StringRef FallbackName =
"unused";
142 StringRef NewName = FallbackName;
146 const auto *M = dyn_cast<CXXMethodDecl>(
P.first);
147 if (M && M->size_overridden_methods() > 0) {
148 const ParmVarDecl *OtherParm =
149 (*M->begin_overridden_methods())->getParamDecl(
P.second);
150 const StringRef Name = OtherParm->getName();
157 const ParmVarDecl *DefParm = Definition->getParamDecl(
P.second);
158 const StringRef Name = DefParm->getName();
166 const ParmVarDecl *Parm =
P.first->getParamDecl(
P.second);
171 const bool IsForwardDeclaration = (!Definition || Function != Definition);
172 if (InsertPlainNamesInForwardDecls && IsForwardDeclaration &&
173 NewName != FallbackName) {
176 D << FixItHint::CreateInsertion(Parm->getLocation(),
177 " " + NewName.str());
179 D << FixItHint::CreateInsertion(Parm->getLocation(),
180 " /*" + NewName.str() +
"*/");
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.