[clang] [clang] "modular_format" attribute for functions using format strings (PR #147431)
Daniel Thornburgh via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 2 16:11:14 PST 2025
================
@@ -6973,6 +6973,73 @@ static void handleVTablePointerAuthentication(Sema &S, Decl *D,
CustomDiscriminationValue));
}
+static bool modularFormatAttrsEquiv(const ModularFormatAttr *Existing,
+ IdentifierInfo *ModularImplFn,
+ StringRef ImplName,
+ ArrayRef<StringRef> Aspects) {
+ return Existing->getModularImplFn() == ModularImplFn &&
+ Existing->getImplName() == ImplName &&
+ Existing->aspects_size() == Aspects.size() &&
+ llvm::equal(Existing->aspects(), Aspects);
+}
+
+ModularFormatAttr *
+Sema::mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI,
+ IdentifierInfo *ModularImplFn, StringRef ImplName,
+ MutableArrayRef<StringRef> Aspects) {
+ if (const auto *Existing = D->getAttr<ModularFormatAttr>()) {
+ if (!modularFormatAttrsEquiv(Existing, ModularImplFn, ImplName, Aspects)) {
+ Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
+ Diag(CI.getLoc(), diag::note_conflicting_attribute);
+ }
+ // Drop the existing attribute on the declaration in favor of the newly
+ // inherited one.
+ D->dropAttr<ModularFormatAttr>();
----------------
mysterymath wrote:
Done.
https://github.com/llvm/llvm-project/pull/147431
More information about the cfe-commits
mailing list