================ @@ -2156,29 +2158,51 @@ static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL) { D->addAttr(::new (S.Context) UnusedAttr(S.Context, AL)); } +static ExprResult sharedGetConstructorDestructorAttrExpr(Sema &S, + const ParsedAttr &AL) { + // If no Expr node exists on the attribute, return a nullptr result (default + // priority to be used). If Expr node exists but is not valid, return an + // invalid result. Otherwise, return the Expr. + Expr *E = nullptr; + if (AL.getNumArgs() == 1) { + E = AL.getArgAsExpr(0); + if (E->isValueDependent()) { + if (!E->isTypeDependent() && !E->getType()->isIntegerType()) { + S.Diag(AL.getLoc(), diag::err_attribute_argument_type) + << AL << AANT_ArgumentIntegerConstant << E->getSourceRange(); + return ExprError(); + } + } else { + uint32_t priority; + if (!S.checkUInt32Argument(AL, AL.getArgAsExpr(0), priority)) { + return ExprError(); + } + return ConstantExpr::Create(S.Context, E, + APValue(llvm::APSInt::getUnsigned(priority))); + } + } + return E; +} + static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) { - uint32_t priority = ConstructorAttr::DefaultPriority; if (S.getLangOpts().HLSL && AL.getNumArgs()) { S.Diag(AL.getLoc(), diag::err_hlsl_init_priority_unsupported); return; } - if (AL.getNumArgs() && - !S.checkUInt32Argument(AL, AL.getArgAsExpr(0), priority)) + ExprResult E = sharedGetConstructorDestructorAttrExpr(S, AL); + if (E.isInvalid()) return; S.Diag(D->getLocation(), diag::warn_global_constructor) << D->getSourceRange(); - - D->addAttr(::new (S.Context) ConstructorAttr(S.Context, AL, priority)); + D->addAttr(::new (S.Context) ConstructorAttr(S.Context, AL, E.get())); ---------------- erichkeane wrote:
```suggestion D->addAttr(ConstructorAttr::Create(S.Context, AL, E.get())); ``` https://github.com/llvm/llvm-project/pull/151400 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits