diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index c3f94cc35e61b..078438fa23320 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -22,8 +22,8 @@ #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclarationName.h" #include "clang/AST/Expr.h" -#include "clang/AST/ExprConcepts.h" #include "clang/AST/ExprCXX.h" +#include "clang/AST/ExprConcepts.h" #include "clang/AST/ExprObjC.h" #include "clang/AST/ExternalASTSource.h" #include "clang/AST/LocInfoType.h" @@ -34,6 +34,7 @@ #include "clang/AST/TypeLoc.h" #include "clang/AST/TypeOrdering.h" #include "clang/Basic/BitmaskEnum.h" +#include "clang/Basic/DiagnosticSema.h" #include "clang/Basic/ExpressionTraits.h" #include "clang/Basic/Module.h" #include "clang/Basic/OpenMPKinds.h" @@ -12326,6 +12327,71 @@ class Sema final { void checkSYCLDeviceFunction(SourceLocation Loc, FunctionDecl *Callee); }; +template +void Sema::AddOneConstantValueAttr(Decl *D, const AttributeCommonInfo &CI, + Expr *E) { + AttrType TmpAttr(Context, CI, E); + + if (!E->isValueDependent()) { + ExprResult ICE; + if (checkRangedIntegralArgument(E, &TmpAttr, ICE)) + return; + E = ICE.get(); + } + + if (IntelFPGAPrivateCopiesAttr::classof(&TmpAttr)) { + if (!D->hasAttr()) + D->addAttr(IntelFPGAMemoryAttr::CreateImplicit( + Context, IntelFPGAMemoryAttr::Default)); + } + + D->addAttr(::new (Context) AttrType(Context, CI, E)); +} + +template +void Sema::AddOneConstantPowerTwoValueAttr(Decl *D, + const AttributeCommonInfo &CI, + Expr *E) { + AttrType TmpAttr(Context, CI, E); + + if (!E->isValueDependent()) { + ExprResult ICE; + if (checkRangedIntegralArgument(E, &TmpAttr, ICE)) + return; + Expr::EvalResult Result; + E->EvaluateAsInt(Result, Context); + llvm::APSInt Value = Result.Val.getInt(); + if (!Value.isPowerOf2()) { + Diag(CI.getLoc(), diag::err_attribute_argument_not_power_of_two) + << &TmpAttr; + return; + } + if (IntelFPGANumBanksAttr::classof(&TmpAttr)) { + if (auto *BBA = D->getAttr()) { + unsigned NumBankBits = BBA->args_size(); + if (NumBankBits != Value.ceilLogBase2()) { + Diag(TmpAttr.getLocation(), diag::err_bankbits_numbanks_conflicting); + return; + } + } + } + E = ICE.get(); + } + + if (!D->hasAttr()) + D->addAttr(IntelFPGAMemoryAttr::CreateImplicit( + Context, IntelFPGAMemoryAttr::Default)); + + // We are adding a user NumBanks, drop any implicit default. + if (IntelFPGANumBanksAttr::classof(&TmpAttr)) { + if (auto *NBA = D->getAttr()) + if (NBA->isImplicit()) + D->dropAttr(); + } + + D->addAttr(::new (Context) AttrType(Context, CI, E)); +} + /// RAII object that enters a new expression evaluation context. class EnterExpressionEvaluationContext { Sema &Actions; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index c6d8acadb8a64..d14bde81887f3 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3869,71 +3869,6 @@ bool Sema::checkRangedIntegralArgument(Expr *E, const AttrType *TmpAttr, return false; } -template -void Sema::AddOneConstantValueAttr(Decl *D, const AttributeCommonInfo &CI, - Expr *E) { - AttrType TmpAttr(Context, CI, E); - - if (!E->isValueDependent()) { - ExprResult ICE; - if (checkRangedIntegralArgument(E, &TmpAttr, ICE)) - return; - E = ICE.get(); - } - - if (IntelFPGAPrivateCopiesAttr::classof(&TmpAttr)) { - if (!D->hasAttr()) - D->addAttr(IntelFPGAMemoryAttr::CreateImplicit( - Context, IntelFPGAMemoryAttr::Default)); - } - - D->addAttr(::new (Context) AttrType(Context, CI, E)); -} - -template -void Sema::AddOneConstantPowerTwoValueAttr(Decl *D, - const AttributeCommonInfo &CI, - Expr *E) { - AttrType TmpAttr(Context, CI, E); - - if (!E->isValueDependent()) { - ExprResult ICE; - if (checkRangedIntegralArgument(E, &TmpAttr, ICE)) - return; - Expr::EvalResult Result; - E->EvaluateAsInt(Result, Context); - llvm::APSInt Value = Result.Val.getInt(); - if (!Value.isPowerOf2()) { - Diag(CI.getLoc(), diag::err_attribute_argument_not_power_of_two) - << &TmpAttr; - return; - } - if (IntelFPGANumBanksAttr::classof(&TmpAttr)) { - if (auto *BBA = D->getAttr()) { - unsigned NumBankBits = BBA->args_size(); - if (NumBankBits != Value.ceilLogBase2()) { - Diag(TmpAttr.getLocation(), diag::err_bankbits_numbanks_conflicting); - return; - } - } - } - E = ICE.get(); - } - - if (!D->hasAttr()) - D->addAttr(IntelFPGAMemoryAttr::CreateImplicit( - Context, IntelFPGAMemoryAttr::Default)); - - // We are adding a user NumBanks, drop any implicit default. - if (IntelFPGANumBanksAttr::classof(&TmpAttr)) { - if (auto *NBA = D->getAttr()) - if (NBA->isImplicit()) - D->dropAttr(); - } - - D->addAttr(::new (Context) AttrType(Context, CI, E)); -} - void Sema::AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion) { AlignedAttr TmpAttr(Context, CI, true, E);