================
@@ -273,6 +286,153 @@ bool Sema::CheckCountedByAttrOnField(FieldDecl *FD, Expr
*E, bool CountInBytes,
return false;
}
+bool Sema::CheckCountedByAttrOnParam(QualType ParamTy, Expr *E,
+ bool CountInBytes, bool OrNull) {
+ // An invalid count was already diagnosed.
+ if (E->containsErrors())
+ return true;
+
+ // A second count would replace the first, or hide it.
+ if (ParamTy->getAs<CountAttributedType>()) {
+ Diag(E->getBeginLoc(), diag::err_count_attr_more_than_one);
+ return true;
+ }
+
+ // An array parameter adjusts to a pointer, which the count then describes.
+ // An array with an explicit size is not supported: in the -fbounds-safety
+ // programming model, its size becomes that pointer's count.
+ unsigned Kind = getCountAttrKind(CountInBytes, OrNull);
+ if (ParamTy->isArrayType() && !ParamTy->isIncompleteArrayType()) {
+ Diag(E->getBeginLoc(), diag::err_count_attr_on_sized_array_param) << Kind;
+ return true;
+ }
+
+ if (!E->getType()->isIntegerType() || E->getType()->isBooleanType()) {
+ Diag(E->getBeginLoc(), diag::err_count_attr_argument_not_integer)
+ << Kind << E->getSourceRange();
+ return true;
+ }
+
+ bool IsDeref;
+ auto *DRE = getCountDeclRef(E, IsDeref);
+ if (!DRE) {
+ Diag(E->getBeginLoc(),
+ diag::err_count_attr_only_support_simple_decl_reference)
+ << Kind << E->getSourceRange();
+ return true;
+ }
+
+ // The parameters of an enclosing function declarator are in scope too.
+ if (!isa<ParmVarDecl>(DRE->getDecl())) {
+ Diag(E->getBeginLoc(), diag::err_count_attr_refer_to_non_param)
+ << E->getSourceRange();
+ return true;
+ }
+ return false;
+}
+
+void Sema::AdjustCountedArrayParamType(ParmVarDecl *PVD,
+ const CountAttributedType *CATy) {
+ if (!CATy->desugar()->isArrayType())
+ return;
+ // The parameter's type is already adjusted, with the qualifiers written
+ // outside the count moved to the element (C99 6.7.3p8), but the decayed
+ // pointer does not carry the count. Put it back on the pointer.
+ PVD->setType(Context.getCountAttributedType(
+ PVD->getType(), CATy->getCountExpr(), CATy->isCountInBytes(),
+ CATy->isOrNull(), CATy->getCoupledDecls()));
+}
+
+/// Whether the count \p E in a declaration of \p FD names a parameter of a
----------------
Holo-xy wrote:
Yes, it meant the declaration of FD's parameters.
but that helper is replaced now.
https://github.com/llvm/llvm-project/pull/230538
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits