diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2013-11-27 22:57:44 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2013-11-27 22:57:44 +0000 |
| commit | fd6c685f2e937d3e3a5b37f9da556c52134e7c35 (patch) | |
| tree | a77c9ee15437c6d9be6d56c84181a2e7c6f60e84 /clang/lib/Sema | |
| parent | e3d6bcf5e0807174ece51251fd5893bda8ed2e9c (diff) | |
| download | bcm5719-llvm-fd6c685f2e937d3e3a5b37f9da556c52134e7c35.tar.gz bcm5719-llvm-fd6c685f2e937d3e3a5b37f9da556c52134e7c35.zip | |
Sema: Instantiation of variable definitions weren't local enough
We wouldn't properly save and restore the pending local instantiations
we had built up prior to instantiation of a variable definition. This
would lead to us instantiating too much causing crashes and other
general badness.
This fixes PR14374.
llvm-svn: 195887
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 136bb5aa4f8..0e6e204e661 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3222,10 +3222,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // while we're still within our own instantiation context. SmallVector<VTableUse, 16> SavedVTableUses; std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; - std::deque<PendingImplicitInstantiation> - SavedPendingLocalImplicitInstantiations; - SavedPendingLocalImplicitInstantiations.swap( - PendingLocalImplicitInstantiations); + SavePendingLocalImplicitInstantiationsRAII + SavedPendingLocalImplicitInstantiations(*this); if (Recursive) { VTableUses.swap(SavedVTableUses); PendingInstantiations.swap(SavedPendingInstantiations); @@ -3306,8 +3304,6 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, "PendingInstantiations should be empty before it is discarded."); PendingInstantiations.swap(SavedPendingInstantiations); } - SavedPendingLocalImplicitInstantiations.swap( - PendingLocalImplicitInstantiations); } VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation( @@ -3727,6 +3723,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, // while we're still within our own instantiation context. SmallVector<VTableUse, 16> SavedVTableUses; std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; + SavePendingLocalImplicitInstantiationsRAII + SavedPendingLocalImplicitInstantiations(*this); if (Recursive) { VTableUses.swap(SavedVTableUses); PendingInstantiations.swap(SavedPendingInstantiations); |

