================
@@ -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()));
}
static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
- uint32_t priority = DestructorAttr::DefaultPriority;
- 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_destructor) <<
D->getSourceRange();
-
- D->addAttr(::new (S.Context) DestructorAttr(S.Context, AL, priority));
+ D->addAttr(::new (S.Context) DestructorAttr(S.Context, AL, E.get()));
----------------
erichkeane wrote:
```suggestion
D->addAttr(DestructorAttr::Create(S.Context, AL, E.get()));
```
https://github.com/llvm/llvm-project/pull/151400
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits