================ @@ -2352,26 +2352,126 @@ static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL) { D->addAttr(::new (S.Context) UnusedAttr(S.Context, AL)); } -static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) { - uint32_t priority = ConstructorAttr::DefaultPriority; +static void diagnoseInvalidPriority(Sema &S, uint32_t Priority, + const ParsedAttr &A, + SourceLocation PriorityLoc) { + constexpr uint32_t ReservedPriorityLower = 101, ReservedPriorityUpper = 65535; + + // Only perform the priority check if the attribute is outside of a system + // header. Values <= 100 are reserved for the implementation, and libc++ + // benefits from being able to specify values in that range. Values > 65535 + // are reserved for historical reasons. + if ((Priority < ReservedPriorityLower || Priority > ReservedPriorityUpper) && + !S.getSourceManager().isInSystemHeader(A.getLoc())) { + S.Diag(A.getLoc(), diag::warn_priority_out_of_range) + << PriorityLoc << A << ReservedPriorityLower << ReservedPriorityUpper; + } +} + +static bool FunctionParamsAreMainLike(ASTContext &Context, + const FunctionDecl *FD) { + assert(FD->hasPrototype() && "expected the function to have a prototype"); + const auto *FPT = FD->getType()->castAs<FunctionProtoType>(); + QualType CharPP = + Context.getPointerType(Context.getPointerType(Context.CharTy)); + QualType Expected[] = {Context.IntTy, CharPP, CharPP, CharPP}; + + for (unsigned I = 0; I < FPT->getNumParams(); ++I) { ---------------- nickdesaulniers wrote:
I'm worries about the expression `Expected[I]` going out of bounds below. I think if you add `&& I < 4` to the loop condition that might be an additional safeguard. https://github.com/llvm/llvm-project/pull/67673 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits