================
@@ -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>();
----------------
erichkeane wrote:
Don't drop here, In error cases, return nullptr and leave the old one in place.
This is our common convention.
https://github.com/llvm/llvm-project/pull/147431
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits