diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 7d14408ab3b46..dc8e5f868d2da 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -498,48 +498,21 @@ static void instantiateDependentAMDGPUWavesPerEUAttr( S.addAMDGPUWavesPerEUAttr(New, Attr, MinExpr, MaxExpr); } -static void instantiateIntelFPGABankWidthAttr( +template +static void instantiateIntelFPGAMemoryAttr( Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, - const IntelFPGABankWidthAttr *Attr, Decl *New) { + const AttrName *Attr, Decl *New) { EnterExpressionEvaluationContext Unevaluated( S, Sema::ExpressionEvaluationContext::ConstantEvaluated); ExprResult Result = S.SubstExpr(Attr->getValue(), TemplateArgs); - if (!Result.isInvalid()) - return S.AddOneConstantPowerTwoValueAttr( - New, *Attr, Result.getAs()); -} - -static void instantiateIntelFPGANumBanksAttr( - Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, - const IntelFPGANumBanksAttr *Attr, Decl *New) { - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::ConstantEvaluated); - ExprResult Result = S.SubstExpr(Attr->getValue(), TemplateArgs); - if (!Result.isInvalid()) - return S.AddOneConstantPowerTwoValueAttr( - New, *Attr, Result.getAs()); -} - -static void instantiateIntelFPGAPrivateCopiesAttr( - Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, - const IntelFPGAPrivateCopiesAttr *Attr, Decl *New) { - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::ConstantEvaluated); - ExprResult Result = S.SubstExpr(Attr->getValue(), TemplateArgs); - if (!Result.isInvalid()) - return S.AddOneConstantValueAttr( - New, *Attr, Result.getAs()); -} - -static void instantiateIntelFPGAMaxReplicatesAttr( - Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, - const IntelFPGAMaxReplicatesAttr *Attr, Decl *New) { - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::ConstantEvaluated); - ExprResult Result = S.SubstExpr(Attr->getValue(), TemplateArgs); - if (!Result.isInvalid()) - return S.AddOneConstantValueAttr( - New, *Attr, Result.getAs()); + if (!Result.isInvalid()) { + if (std::is_same::value || + std::is_same::value) + return S.AddOneConstantPowerTwoValueAttr(New, *Attr, + Result.getAs()); + return S.AddOneConstantValueAttr(New, *Attr, + Result.getAs()); + } } static void instantiateIntelFPGABankBitsAttr( @@ -557,17 +530,6 @@ static void instantiateIntelFPGABankBitsAttr( S.AddIntelFPGABankBitsAttr(New, *Attr, Args.data(), Args.size()); } -static void instantiateIntelFPGAForcePow2DepthAttr( - Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, - const IntelFPGAForcePow2DepthAttr *Attr, Decl *New) { - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::ConstantEvaluated); - ExprResult Result = S.SubstExpr(Attr->getValue(), TemplateArgs); - if (!Result.isInvalid()) - S.AddOneConstantValueAttr( - New, *Attr, Result.getAs()); -} - static void instantiateSYCLIntelPipeIOAttr( Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const SYCLIntelPipeIOAttr *Attr, Decl *New) { @@ -700,23 +662,24 @@ void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, if (const auto *IntelFPGABankWidth = dyn_cast(TmplAttr)) { - instantiateIntelFPGABankWidthAttr(*this, TemplateArgs, IntelFPGABankWidth, - New); + instantiateIntelFPGAMemoryAttr( + *this, TemplateArgs, IntelFPGABankWidth, New); } + if (const auto *IntelFPGANumBanks = dyn_cast(TmplAttr)) { - instantiateIntelFPGANumBanksAttr(*this, TemplateArgs, IntelFPGANumBanks, - New); + instantiateIntelFPGAMemoryAttr( + *this, TemplateArgs, IntelFPGANumBanks, New); } if (const auto *IntelFPGAPrivateCopies = dyn_cast(TmplAttr)) { - instantiateIntelFPGAPrivateCopiesAttr(*this, TemplateArgs, - IntelFPGAPrivateCopies, New); + instantiateIntelFPGAMemoryAttr( + *this, TemplateArgs, IntelFPGAPrivateCopies, New); } if (const auto *IntelFPGAMaxReplicates = dyn_cast(TmplAttr)) { - instantiateIntelFPGAMaxReplicatesAttr(*this, TemplateArgs, - IntelFPGAMaxReplicates, New); + instantiateIntelFPGAMemoryAttr( + *this, TemplateArgs, IntelFPGAMaxReplicates, New); } if (const auto *IntelFPGABankBits = dyn_cast(TmplAttr)) { @@ -725,8 +688,8 @@ void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, } if (const auto *IntelFPGAForcePow2Depth = dyn_cast(TmplAttr)) { - instantiateIntelFPGAForcePow2DepthAttr(*this, TemplateArgs, - IntelFPGAForcePow2Depth, New); + instantiateIntelFPGAMemoryAttr( + *this, TemplateArgs, IntelFPGAForcePow2Depth, New); } if (const auto *SYCLIntelPipeIO = dyn_cast(TmplAttr)) { instantiateSYCLIntelPipeIOAttr(*this, TemplateArgs, SYCLIntelPipeIO, New);