hnrklssn wrote:
> > Or just convert `counted_by` into `sized_by` with no need for another
> > spelling (i.e. I could nudge this patch slightly so that
> > `CountAttributedType::SizedBy` gets set earlier in Sema and then `
> > CodeGenFunction::emitCountedByPointerSize` would need no changes, etc.)
>
> I.e. the only logic change (i.e. keep all the tests) needed would be this:
>
> ```diff
> diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
> index 964a2a791e18..c97ec9cea0c6 100644
> --- a/clang/lib/Sema/SemaDeclAttr.cpp
> +++ b/clang/lib/Sema/SemaDeclAttr.cpp
> @@ -6577,6 +6577,20 @@ static void handleCountedByAttrField(Sema &S, Decl *D,
> const ParsedAttr &AL) {
> llvm_unreachable("unexpected counted_by family attribute");
> }
>
> + // In GNU mode, silently convert counted_by/counted_by_or_null on void*
> + // to sized_by/sized_by_or_null, since void has size 1 in GNU pointer
> + // arithmetic.
> + if (!CountInBytes && FD->getType()->isPointerType()) {
> + QualType PointeeTy = FD->getType()->getPointeeType();
> + if (PointeeTy->isVoidType() && S.getLangOpts().GNUMode) {
> + // Emit diagnostic before conversion
> + S.Diag(FD->getBeginLoc(), diag::ext_gnu_counted_by_void_ptr)
> + << (OrNull ? CountAttributedType::CountedByOrNull
> + : CountAttributedType::CountedBy);
> + CountInBytes = true; // Convert to sized_by variant
> + }
> + }
> +
> if (S.CheckCountedByAttrOnField(FD, CountExpr, CountInBytes, OrNull))
> return;
>
> ```
>
> This is, perhaps, much cleaner?
That seems a lot easier to maintain! You may have to live with diagnostics
saying `__sized_by` despite the code saying `__counted_by` though.
https://github.com/llvm/llvm-project/pull/164737
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits