================ @@ -5335,6 +5335,217 @@ static void handlePreferredTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL) { D->addAttr(::new (S.Context) PreferredTypeAttr(S.Context, AL, ParmTSI)); } +// This function is called only if function call is not inside template body. +// TODO: Add call for function calls inside template body. +// Emit warnings if parent function misses format attributes. +void Sema::DiagnoseMissingFormatAttributes(Stmt *Body, + const FunctionDecl *FDecl) { + assert(FDecl); + + // If there are no function body, exit. + if (!Body) + return; + + // Get missing format attributes + std::vector<FormatAttr *> MissingFormatAttributes = + GetMissingFormatAttributes(Body, FDecl); + if (MissingFormatAttributes.empty()) + return; + + // Check if there are more than one format type found. In that case do not + // emit diagnostic. + const clang::IdentifierInfo *AttrType = MissingFormatAttributes[0]->getType(); + if (llvm::any_of(MissingFormatAttributes, [&](const FormatAttr *Attr) { + return AttrType != Attr->getType(); + })) + return; + + for (const FormatAttr *FA : MissingFormatAttributes) { + // If format index and first-to-check argument index are negative, it means + // that this attribute is only saved for multiple format types checking. + if (FA->getFormatIdx() < 0 || FA->getFirstArg() < 0) + continue; + + // Emit diagnostic + SourceLocation Loc = FDecl->getLocation(); + Diag(Loc, diag::warn_missing_format_attribute) + << FA->getType() << FDecl + << FixItHint::CreateInsertion(Loc, + (llvm::Twine("__attribute__((format(") + + FA->getType()->getName() + ", " + + llvm::Twine(FA->getFormatIdx()) + ", " + + llvm::Twine(FA->getFirstArg()) + ")))") + .str()); + } +} + +// Returns vector of format attributes. There are no two attributes with same +// arguments in returning vector. There can be attributes that effectivelly only ---------------- aaronpuchert wrote:
```suggestion // arguments in returning vector. There can be attributes that effectively only ``` https://github.com/llvm/llvm-project/pull/105479 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits