Author: stephant Date: Thu Mar 13 15:34:22 2014 New Revision: 203846 URL: http://llvm.org/viewvc/llvm-project?rev=203846&view=rev Log: Refactor InstantiatingTemplate constructors
This patch factors the bodies of 9 constructors out into a single initialization method. Reviewed By: rsmith Differential Revision: http://llvm-reviews.chandlerc.com/D3059 Modified: cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=203846&r1=203845&r2=203846&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 13 15:34:22 2014 @@ -6258,13 +6258,15 @@ public: SourceRange InstantiationRange = SourceRange()); /// \brief Note that we are substituting prior template arguments into a - /// non-type or template template parameter. + /// non-type parameter. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template, NonTypeTemplateParmDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange); + /// \brief Note that we are substituting prior template arguments into a + /// template template parameter. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template, TemplateTemplateParmDecl *Param, @@ -6296,6 +6298,15 @@ public: bool CheckInstantiationDepth(SourceLocation PointOfInstantiation, SourceRange InstantiationRange); + // FIXME: Replace this with a constructor once we can use delegating + // constructors in llvm. + void Initialize( + ActiveTemplateInstantiation::InstantiationKind Kind, + SourceLocation PointOfInstantiation, SourceRange InstantiationRange, + Decl *Entity, NamedDecl *Template = nullptr, + ArrayRef<TemplateArgument> TemplateArgs = ArrayRef<TemplateArgument>(), + sema::TemplateDeductionInfo *DeductionInfo = nullptr); + InstantiatingTemplate(const InstantiatingTemplate&) LLVM_DELETED_FUNCTION; InstantiatingTemplate& Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=203846&r1=203845&r2=203846&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Thu Mar 13 15:34:22 2014 @@ -200,50 +200,49 @@ bool Sema::ActiveTemplateInstantiation:: llvm_unreachable("Invalid InstantiationKind!"); } -Sema::InstantiatingTemplate:: -InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, - Decl *Entity, - SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) -{ - Invalid = CheckInstantiationDepth(PointOfInstantiation, - InstantiationRange); +void Sema::InstantiatingTemplate::Initialize( + ActiveTemplateInstantiation::InstantiationKind Kind, + SourceLocation PointOfInstantiation, SourceRange InstantiationRange, + Decl *Entity, NamedDecl *Template, ArrayRef<TemplateArgument> TemplateArgs, + sema::TemplateDeductionInfo *DeductionInfo) { + SavedInNonInstantiationSFINAEContext = + SemaRef.InNonInstantiationSFINAEContext; + Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); if (!Invalid) { ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation; + Inst.Kind = Kind; Inst.PointOfInstantiation = PointOfInstantiation; Inst.Entity = Entity; - Inst.TemplateArgs = 0; - Inst.NumTemplateArgs = 0; + Inst.Template = Template; + Inst.TemplateArgs = TemplateArgs.data(); + Inst.NumTemplateArgs = TemplateArgs.size(); + Inst.DeductionInfo = DeductionInfo; Inst.InstantiationRange = InstantiationRange; SemaRef.InNonInstantiationSFINAEContext = false; SemaRef.ActiveTemplateInstantiations.push_back(Inst); + if (!Inst.isInstantiationRecord()) + ++SemaRef.NonInstantiationEntries; } } Sema::InstantiatingTemplate:: InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, + Decl *Entity, + SourceRange InstantiationRange) + : SemaRef(SemaRef) +{ + Initialize(ActiveTemplateInstantiation::TemplateInstantiation, + PointOfInstantiation, InstantiationRange, Entity); +} + +Sema::InstantiatingTemplate:: +InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, FunctionDecl *Entity, ExceptionSpecification, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, - InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::ExceptionSpecInstantiation; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = Entity; - Inst.TemplateArgs = 0; - Inst.NumTemplateArgs = 0; - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::ExceptionSpecInstantiation, + PointOfInstantiation, InstantiationRange, Entity); } Sema::InstantiatingTemplate:: @@ -251,24 +250,11 @@ InstantiatingTemplate(Sema &SemaRef, Sou TemplateDecl *Template, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, - InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind - = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = Template; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation, + PointOfInstantiation, InstantiationRange, + Template, nullptr, TemplateArgs); } Sema::InstantiatingTemplate:: @@ -278,26 +264,10 @@ InstantiatingTemplate(Sema &SemaRef, Sou ActiveTemplateInstantiation::InstantiationKind Kind, sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = Kind; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = FunctionTemplate; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.DeductionInfo = &DeductionInfo; - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - - if (!Inst.isInstantiationRecord()) - ++SemaRef.NonInstantiationEntries; - } + Initialize(Kind, PointOfInstantiation, InstantiationRange, + FunctionTemplate, nullptr, TemplateArgs, &DeductionInfo); } Sema::InstantiatingTemplate:: @@ -306,23 +276,11 @@ InstantiatingTemplate(Sema &SemaRef, Sou ArrayRef<TemplateArgument> TemplateArgs, sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = PartialSpec; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.DeductionInfo = &DeductionInfo; - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution, + PointOfInstantiation, InstantiationRange, + PartialSpec, nullptr, TemplateArgs, &DeductionInfo); } Sema::InstantiatingTemplate::InstantiatingTemplate( @@ -330,22 +288,11 @@ Sema::InstantiatingTemplate::Instantiati VarTemplatePartialSpecializationDecl *PartialSpec, ArrayRef<TemplateArgument> TemplateArgs, sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) - : SemaRef(SemaRef), SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = - ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = PartialSpec; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.DeductionInfo = &DeductionInfo; - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + : SemaRef(SemaRef) +{ + Initialize(ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution, + PointOfInstantiation, InstantiationRange, + PartialSpec, nullptr, TemplateArgs, &DeductionInfo); } Sema::InstantiatingTemplate:: @@ -353,47 +300,24 @@ InstantiatingTemplate(Sema &SemaRef, Sou ParmVarDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind - = ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Entity = Param; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation, + PointOfInstantiation, InstantiationRange, + Param, nullptr, TemplateArgs); } + Sema::InstantiatingTemplate:: InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template, NonTypeTemplateParmDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Template = Template; - Inst.Entity = Param; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution, + PointOfInstantiation, InstantiationRange, + Param, Template, TemplateArgs); } Sema::InstantiatingTemplate:: @@ -401,23 +325,11 @@ InstantiatingTemplate(Sema &SemaRef, Sou NamedDecl *Template, TemplateTemplateParmDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) + : SemaRef(SemaRef) { - Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); - if (!Invalid) { - ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Template = Template; - Inst.Entity = Param; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - } + Initialize(ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution, + PointOfInstantiation, InstantiationRange, + Param, Template, TemplateArgs); } Sema::InstantiatingTemplate:: @@ -425,25 +337,11 @@ InstantiatingTemplate(Sema &SemaRef, Sou TemplateDecl *Template, NamedDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) - : SemaRef(SemaRef), - SavedInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext) -{ - Invalid = false; - - ActiveTemplateInstantiation Inst; - Inst.Kind = ActiveTemplateInstantiation::DefaultTemplateArgumentChecking; - Inst.PointOfInstantiation = PointOfInstantiation; - Inst.Template = Template; - Inst.Entity = Param; - Inst.TemplateArgs = TemplateArgs.data(); - Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.InstantiationRange = InstantiationRange; - SemaRef.InNonInstantiationSFINAEContext = false; - SemaRef.ActiveTemplateInstantiations.push_back(Inst); - - assert(!Inst.isInstantiationRecord()); - ++SemaRef.NonInstantiationEntries; + : SemaRef(SemaRef) +{ + Initialize(ActiveTemplateInstantiation::DefaultTemplateArgumentChecking, + PointOfInstantiation, InstantiationRange, + Param, Template, TemplateArgs); } void Sema::InstantiatingTemplate::Clear() { _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
