From 7a92e1ad3d44d2e0528d6cd5c1e99fc34a8acf2b Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 18 Jan 2015 01:50:35 +0000 Subject: [PATCH] Address review feedback from r215780: Use a flag insteda of the heap. No behavior change. llvm-svn: 226389 --- clang/include/clang/Sema/Sema.h | 8 ++++- .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 36 +++++++------------ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 74efa60c9366..9aed52a22dd9 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -6720,12 +6720,17 @@ public: class SavePendingInstantiationsAndVTableUsesRAII { public: - SavePendingInstantiationsAndVTableUsesRAII(Sema &S): S(S) { + SavePendingInstantiationsAndVTableUsesRAII(Sema &S, bool Enabled) + : S(S), Enabled(Enabled) { + if (!Enabled) return; + SavedPendingInstantiations.swap(S.PendingInstantiations); SavedVTableUses.swap(S.VTableUses); } ~SavePendingInstantiationsAndVTableUsesRAII() { + if (!Enabled) return; + // Restore the set of pending vtables. assert(S.VTableUses.empty() && "VTableUses should be empty before it is discarded."); @@ -6741,6 +6746,7 @@ public: Sema &S; SmallVector SavedVTableUses; std::deque SavedPendingInstantiations; + bool Enabled; }; /// \brief The queue of implicit template instantiations that are required diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 40e86175b2cd..1df0701ee9f4 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3313,12 +3313,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // it marks vtables used in late parsed templates as used. SavePendingLocalImplicitInstantiationsRAII SavedPendingLocalImplicitInstantiations(*this); - std::unique_ptr - SavePendingInstantiationsAndVTableUses; - if (Recursive) { - SavePendingInstantiationsAndVTableUses.reset( - new SavePendingInstantiationsAndVTableUsesRAII(*this)); - } + SavePendingInstantiationsAndVTableUsesRAII + SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive); // Call the LateTemplateParser callback if there is a need to late parse // a templated function definition. @@ -3463,8 +3459,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // instantiation of this template. PerformPendingInstantiations(); - // Restore PendingInstantiations and VTableUses. - SavePendingInstantiationsAndVTableUses.reset(); + // PendingInstantiations and VTableUses are restored through + // SavePendingInstantiationsAndVTableUses's destructor. } } @@ -3780,12 +3776,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, // If we're performing recursive template instantiation, create our own // queue of pending implicit instantiations that we will instantiate // later, while we're still within our own instantiation context. - std::unique_ptr - SavePendingInstantiationsAndVTableUses; - if (Recursive) { - SavePendingInstantiationsAndVTableUses.reset( - new SavePendingInstantiationsAndVTableUsesRAII(*this)); - } + SavePendingInstantiationsAndVTableUsesRAII + SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive); LocalInstantiationScope Local(*this); @@ -3812,8 +3804,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, // instantiation of this template. PerformPendingInstantiations(); - // Restore PendingInstantiations and VTableUses. - SavePendingInstantiationsAndVTableUses.reset(); + // PendingInstantiations and VTableUses are restored through + // SavePendingInstantiationsAndVTableUses's destructor. } } @@ -3899,12 +3891,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, // while we're still within our own instantiation context. SavePendingLocalImplicitInstantiationsRAII SavedPendingLocalImplicitInstantiations(*this); - std::unique_ptr - SavePendingInstantiationsAndVTableUses; - if (Recursive) { - SavePendingInstantiationsAndVTableUses.reset( - new SavePendingInstantiationsAndVTableUsesRAII(*this)); - } + SavePendingInstantiationsAndVTableUsesRAII + SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive); // Enter the scope of this instantiation. We don't use // PushDeclContext because we don't have a scope. @@ -3970,8 +3958,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, // instantiation of this template. PerformPendingInstantiations(); - // Restore PendingInstantiations and VTableUses. - SavePendingInstantiationsAndVTableUses.reset(); + // PendingInstantiations and VTableUses are restored through + // SavePendingInstantiationsAndVTableUses's destructor. } }