[clang] [Sema] Enforce parameter match for ownership_returns attribute (PR #192339)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 11:56:21 PDT 2026
================
@@ -1558,24 +1572,30 @@ static void handleOwnershipAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
// Cannot have two ownership attributes of different kinds for the same
// index.
if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
- S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
- << AL << I
- << (AL.isRegularKeywordAttribute() ||
- I->isRegularKeywordAttribute());
- return;
- } else if (K == OwnershipAttr::Returns &&
+ S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
+ << AL << I
+ << (AL.isRegularKeywordAttribute() ||
+ I->isRegularKeywordAttribute());
+ return;
+ }
+
+ if (K == OwnershipAttr::Returns &&
I->getOwnKind() == OwnershipAttr::Returns) {
- // A returns attribute conflicts with any other returns attribute using
- // a different index.
- if (!llvm::is_contained(I->args(), Idx)) {
+ bool IHasArgs = I->args_size() > 0;
+
+ if (!IHasArgs || !llvm::is_contained(I->args(), Idx)) {
+ unsigned IIdx = IHasArgs ? I->args_begin()->getSourceIndex() : 0;
+
S.Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
- << I->args_begin()->getSourceIndex();
- if (I->args_size())
- S.Diag(AL.getLoc(), diag::note_ownership_returns_index_mismatch)
- << Idx.getSourceIndex() << Ex->getSourceRange();
+ << IIdx << (IHasArgs ? 0 : 1);
+
+ S.Diag(AL.getLoc(), diag::note_ownership_returns_index_mismatch)
+ << Idx.getSourceIndex() << 0 << Ex->getSourceRange();
return;
}
- } else if (K == OwnershipAttr::Takes &&
+ }
+
+ if (K == OwnershipAttr::Takes &&
----------------
AaronBallman wrote:
I think this one is still an `else if` situation because there's not an unconditional return before it.
https://github.com/llvm/llvm-project/pull/192339
More information about the cfe-commits
mailing list