================
@@ -253,20 +319,36 @@ static void EmitIncompleteCountedByPointeeNotes(Sema &S,
<< CATy->getPointeeType();
}
- // Suggest using __sized_by(_or_null) instead of __counted_by(_or_null) as
- // __sized_by(_or_null) doesn't have the complete type restriction.
- //
- // We use the source range of the expression on the CountAttributedType as an
- // approximation for the source range of the attribute. This isn't quite
right
- // but isn't easy to fix right now.
- //
- // TODO: Implement logic to find the relevant TypeLoc for the attribute and
- // get the SourceRange from that (#113582).
- //
- // TODO: We should emit a fix-it here.
- SourceRange AttrSrcRange = CATy->getCountExpr()->getSourceRange();
+ CountAttributedTypeLoc CATL;
+ if (!TL.isNull())
+ CATL = TL.getAs<CountAttributedTypeLoc>();
+
+ if (CATL.isNull()) {
+ // Fall back to pointing to the count expr - not great, but close enough.
+ // This should happen rarely, if ever.
+ S.Diag(CATy->getCountExpr()->getExprLoc(),
+ diag::note_counted_by_consider_using_sized_by)
+ << CATy->isOrNull();
+ return;
+ }
+ SourceRange AttrSrcRange = CATL.getAttrNameRange(S);
+
+ StringRef Spelling = CATL.getAttrNameAsWritten(S);
+ StringRef FixedSpelling;
+ if (Spelling == "__counted_by")
+ FixedSpelling = "__sized_by";
+ else if (Spelling == "counted_by")
+ FixedSpelling = "sized_by";
+ else if (Spelling == "__counted_by_or_null")
+ FixedSpelling = "__sized_by_or_null";
+ else if (Spelling == "counted_by_or_null")
+ FixedSpelling = "sized_by_or_null";
----------------
zwuis wrote:
Can we use `llvm::StringSwitch`?
https://github.com/llvm/llvm-project/pull/167287
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits