@@ -4514,7 +4514,9 @@ class SubstNonTypeTemplateParmExpr : public Expr {
45144514 llvm::PointerIntPair<Decl *, 1 , bool > AssociatedDeclAndRef;
45154515
45164516 unsigned Index : 15 ;
4517- unsigned PackIndex : 16 ;
4517+ unsigned PackIndex : 15 ;
4518+ LLVM_PREFERRED_TYPE (bool )
4519+ unsigned Final : 1 ;
45184520
45194521 explicit SubstNonTypeTemplateParmExpr (EmptyShell Empty)
45204522 : Expr(SubstNonTypeTemplateParmExprClass, Empty) {}
@@ -4523,11 +4525,12 @@ class SubstNonTypeTemplateParmExpr : public Expr {
45234525 SubstNonTypeTemplateParmExpr (QualType Ty, ExprValueKind ValueKind,
45244526 SourceLocation Loc, Expr *Replacement,
45254527 Decl *AssociatedDecl, unsigned Index,
4526- std::optional<unsigned > PackIndex, bool RefParam)
4528+ std::optional<unsigned > PackIndex, bool RefParam,
4529+ bool Final)
45274530 : Expr(SubstNonTypeTemplateParmExprClass, Ty, ValueKind, OK_Ordinary),
45284531 Replacement (Replacement),
45294532 AssociatedDeclAndRef(AssociatedDecl, RefParam), Index(Index),
4530- PackIndex(PackIndex ? *PackIndex + 1 : 0 ) {
4533+ PackIndex(PackIndex ? *PackIndex + 1 : 0 ), Final(Final) {
45314534 assert (AssociatedDecl != nullptr );
45324535 SubstNonTypeTemplateParmExprBits.NameLoc = Loc;
45334536 setDependence (computeDependence (this ));
@@ -4555,6 +4558,10 @@ class SubstNonTypeTemplateParmExpr : public Expr {
45554558 return PackIndex - 1 ;
45564559 }
45574560
4561+ // This substitution is Final, which means the substitution is fully
4562+ // sugared: it doesn't need to be resugared later.
4563+ bool getFinal () const { return Final; }
4564+
45584565 NonTypeTemplateParmDecl *getParameter () const ;
45594566
45604567 bool isReferenceParameter () const { return AssociatedDeclAndRef.getInt (); }
@@ -4598,7 +4605,10 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
45984605 const TemplateArgument *Arguments;
45994606
46004607 // / The number of template arguments in \c Arguments.
4601- unsigned NumArguments : 16 ;
4608+ unsigned NumArguments : 15 ;
4609+
4610+ LLVM_PREFERRED_TYPE (bool )
4611+ unsigned Final : 1 ;
46024612
46034613 unsigned Index : 16 ;
46044614
@@ -4612,7 +4622,8 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
46124622 SubstNonTypeTemplateParmPackExpr (QualType T, ExprValueKind ValueKind,
46134623 SourceLocation NameLoc,
46144624 const TemplateArgument &ArgPack,
4615- Decl *AssociatedDecl, unsigned Index);
4625+ Decl *AssociatedDecl, unsigned Index,
4626+ bool Final);
46164627
46174628 // / A template-like entity which owns the whole pattern being substituted.
46184629 // / This will own a set of template parameters.
@@ -4622,6 +4633,10 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
46224633 // / This should match the result of `getParameterPack()->getIndex()`.
46234634 unsigned getIndex () const { return Index; }
46244635
4636+ // This substitution will be Final, which means the substitution will be fully
4637+ // sugared: it doesn't need to be resugared later.
4638+ bool getFinal () const { return Final; }
4639+
46254640 // / Retrieve the non-type template parameter pack being substituted.
46264641 NonTypeTemplateParmDecl *getParameterPack () const ;
46274642
0 commit comments