diff options
| author | Mingming Liu <mingmingl@google.com> | 2025-09-10 15:25:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-10 15:25:31 -0700 |
| commit | 1417dafa1db9cb1b2b09438aa9f53ea5ab6e36e2 (patch) | |
| tree | 57f4b1f313c8cf74eed8819870f39c36ea263c68 /clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | |
| parent | 898b813bc8a6d0276bf0f4769f5f2f64b34e632d (diff) | |
| parent | b8cefcb601ddaa18482555c4ff363c01a270c2fe (diff) | |
Merge branch 'main' into users/mingmingl-llvm/samplefdo-profile-formatusers/mingmingl-llvm/samplefdo-profile-format
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateDecl.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 83 |
1 files changed, 61 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 681ee796440f..b3cbd7f8c1ef 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -234,6 +234,32 @@ static void instantiateDependentAnnotationAttr( } } +template <typename Attr> +static void sharedInstantiateConstructorDestructorAttr( + Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, + Decl *New, ASTContext &C) { + Expr *tempInstPriority = nullptr; + { + EnterExpressionEvaluationContext Unevaluated( + S, Sema::ExpressionEvaluationContext::Unevaluated); + ExprResult Result = S.SubstExpr(A->getPriority(), TemplateArgs); + if (Result.isInvalid()) + return; + tempInstPriority = Result.get(); + if (std::optional<llvm::APSInt> CE = + tempInstPriority->getIntegerConstantExpr(C)) { + // Consistent with non-templated priority arguments, which must fit in a + // 32-bit unsigned integer. + if (!CE->isIntN(32)) { + S.Diag(tempInstPriority->getExprLoc(), diag::err_ice_too_large) + << toString(*CE, 10, false) << /*Size=*/32 << /*Unsigned=*/1; + return; + } + } + } + New->addAttr(Attr::Create(C, tempInstPriority, *A)); +} + static Expr *instantiateDependentFunctionAttrCondition( Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Expr *OldCond, const Decl *Tmpl, FunctionDecl *New) { @@ -825,6 +851,18 @@ void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, continue; } + if (auto *Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) { + sharedInstantiateConstructorDestructorAttr(*this, TemplateArgs, + Constructor, New, Context); + continue; + } + + if (auto *Destructor = dyn_cast<DestructorAttr>(TmplAttr)) { + sharedInstantiateConstructorDestructorAttr(*this, TemplateArgs, + Destructor, New, Context); + continue; + } + if (const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) { instantiateDependentEnableIfAttr(*this, TemplateArgs, EnableIf, Tmpl, cast<FunctionDecl>(New)); @@ -4542,14 +4580,17 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl( PrevDecl->getPointOfInstantiation(), Ignored)) return nullptr; - return VisitVarTemplateSpecializationDecl(InstVarTemplate, D, - VarTemplateArgsInfo, - CTAI.CanonicalConverted, PrevDecl); + if (VarTemplateSpecializationDecl *VTSD = VisitVarTemplateSpecializationDecl( + InstVarTemplate, D, CTAI.CanonicalConverted, PrevDecl)) { + VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo); + return VTSD; + } + return nullptr; } -Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl( +VarTemplateSpecializationDecl * +TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl( VarTemplateDecl *VarTemplate, VarDecl *D, - const TemplateArgumentListInfo &TemplateArgsInfo, ArrayRef<TemplateArgument> Converted, VarTemplateSpecializationDecl *PrevDecl) { @@ -4570,7 +4611,6 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl( VarTemplateSpecializationDecl *Var = VarTemplateSpecializationDecl::Create( SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(), VarTemplate, DI->getType(), DI, D->getStorageClass(), Converted); - Var->setTemplateArgsAsWritten(TemplateArgsInfo); if (!PrevDecl) { void *InsertPos = nullptr; VarTemplate->findSpecialization(Converted, InsertPos); @@ -5880,7 +5920,6 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation( VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, - const TemplateArgumentListInfo &TemplateArgsInfo, SmallVectorImpl<TemplateArgument> &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs, LocalInstantiationScope *StartingScope) { @@ -5922,9 +5961,8 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation( // TODO: Set LateAttrs and StartingScope ... - return cast_or_null<VarTemplateSpecializationDecl>( - Instantiator.VisitVarTemplateSpecializationDecl( - VarTemplate, FromVar, TemplateArgsInfo, Converted)); + return Instantiator.VisitVarTemplateSpecializationDecl(VarTemplate, FromVar, + Converted); } VarTemplateSpecializationDecl *Sema::CompleteVarTemplateSpecializationDecl( @@ -6340,10 +6378,15 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, TemplateArgInfo.addArgument(Arg); } - Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl( - VarSpec->getSpecializedTemplate(), Def, TemplateArgInfo, - VarSpec->getTemplateArgs().asArray(), VarSpec)); + VarTemplateSpecializationDecl *VTSD = + Instantiator.VisitVarTemplateSpecializationDecl( + VarSpec->getSpecializedTemplate(), Def, + VarSpec->getTemplateArgs().asArray(), VarSpec); + Var = VTSD; + if (Var) { + VTSD->setTemplateArgsAsWritten(TemplateArgInfo); + llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *> PatternPtr = VarSpec->getSpecializedTemplateOrPartial(); @@ -6973,19 +7016,15 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, // If our context used to be dependent, we may need to instantiate // it before performing lookup into that context. bool IsBeingInstantiated = false; - if (CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) { + if (auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) { if (!Spec->isDependentContext()) { - CanQualType T = Context.getCanonicalTagType(Spec); - const RecordType *Tag = T->getAs<RecordType>(); - assert(Tag && "type of non-dependent record is not a RecordType"); - auto *TagDecl = - cast<CXXRecordDecl>(Tag->getOriginalDecl())->getDefinitionOrSelf(); - if (TagDecl->isBeingDefined()) + if (Spec->isEntityBeingDefined()) IsBeingInstantiated = true; - else if (RequireCompleteType(Loc, T, diag::err_incomplete_type)) + else if (RequireCompleteType(Loc, Context.getCanonicalTagType(Spec), + diag::err_incomplete_type)) return nullptr; - ParentDC = TagDecl; + ParentDC = Spec->getDefinitionOrSelf(); } } |
