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>())
104 if (Typedef->getDecl()->getQualifiedNameAsString() ==
"testing::Unused")
108 if (Parm->getType().getCanonicalType()->isNullPtrType())
113 if (
const auto *Record =
114 Parm->getType().getCanonicalType()->getAsCXXRecordDecl()) {
115 const std::string QName = Record->getQualifiedNameAsString();
116 if (llvm::is_contained(IgnoredTypes, QName))
122 const char *Begin = SM.getCharacterData(Parm->getBeginLoc());
123 const char *End = SM.getCharacterData(Parm->getLocation());
124 const StringRef Data(Begin, End - Begin);
125 if (Data.contains(
"/*"))
128 UnnamedParams.emplace_back(Function, I);
132 if (!UnnamedParams.empty()) {
133 const ParmVarDecl *FirstParm =
134 UnnamedParams.front().first->getParamDecl(UnnamedParams.front().second);
135 auto D = diag(FirstParm->getLocation(),
136 "all parameters should be named in a function");
138 for (
auto P : UnnamedParams) {
140 static constexpr StringRef FallbackName =
"unused";
141 StringRef NewName = FallbackName;
145 const auto *M = dyn_cast<CXXMethodDecl>(
P.first);
146 if (M && M->size_overridden_methods() > 0) {
147 const ParmVarDecl *OtherParm =
148 (*M->begin_overridden_methods())->getParamDecl(
P.second);
149 const StringRef Name = OtherParm->getName();
156 const ParmVarDecl *DefParm = Definition->getParamDecl(
P.second);
157 const StringRef Name = DefParm->getName();
165 const ParmVarDecl *Parm =
P.first->getParamDecl(
P.second);
170 const bool IsForwardDeclaration = (!Definition || Function != Definition);
171 if (InsertPlainNamesInForwardDecls && IsForwardDeclaration &&
172 NewName != FallbackName) {
175 D << FixItHint::CreateInsertion(Parm->getLocation(),
176 " " + NewName.str());
178 D << FixItHint::CreateInsertion(Parm->getLocation(),
179 " /*" + NewName.str() +
"*/");
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.