40 std::string BadDecl =
"badDecl";
42 varDecl(unless(hasInitializer(anything())), unless(isInstantiated()),
43 isLocalVarDecl(), unless(isStaticLocal()), isDefinition(),
44 unless(hasParent(cxxCatchStmt())),
45 optionally(hasParent(declStmt(hasParent(
46 cxxForRangeStmt(hasLoopVariable(varDecl().bind(BadDecl))))))),
47 unless(equalsBoundNode(BadDecl)))
59 const auto *MatchedDecl = Result.Nodes.getNodeAs<VarDecl>(
"vardecl");
60 const ASTContext &Context = *Result.Context;
61 const SourceManager &Source = Context.getSourceManager();
64 if (MatchedDecl->isInvalidDecl())
82 if (MatchedDecl->getEndLoc().isMacroID())
85 QualType TypePtr = MatchedDecl->getType();
86 std::optional<const char *> InitializationString;
87 bool AddMathInclude =
false;
89 if (TypePtr->isEnumeralType())
90 InitializationString =
nullptr;
91 else if (TypePtr->isBooleanType())
92 InitializationString =
" = false";
93 else if (TypePtr->isIntegerType())
94 InitializationString =
" = 0";
95 else if (TypePtr->isFloatingType()) {
96 InitializationString =
" = NAN";
97 AddMathInclude =
true;
98 }
else if (TypePtr->isAnyPointerType()) {
99 if (getLangOpts().CPlusPlus11)
100 InitializationString =
" = nullptr";
102 InitializationString =
" = NULL";
105 if (InitializationString) {
107 diag(MatchedDecl->getLocation(),
"variable %0 is not initialized")
109 if (*InitializationString !=
nullptr)
110 Diagnostic << FixItHint::CreateInsertion(
112 *Result.SourceManager,
113 Result.Context->getLangOpts()),
114 *InitializationString);
115 if (AddMathInclude) {
116 Diagnostic << IncludeInserter.createIncludeInsertion(
117 Source.getFileID(MatchedDecl->getBeginLoc()), MathHeader);
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.