diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 5 |
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 6b3ea437ab6..f5f7bfec5fa 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -415,6 +415,22 @@ ClassTemplateSpecializationDecl::Create(ASTContext &Context, return Result; } +void ClassTemplateSpecializationDecl::Destroy(ASTContext &C) { + if (SpecializedPartialSpecialization *PartialSpec + = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) + C.Deallocate(PartialSpec); + + CXXRecordDecl::Destroy(C); +} + +ClassTemplateDecl * +ClassTemplateSpecializationDecl::getSpecializedTemplate() const { + if (SpecializedPartialSpecialization *PartialSpec + = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) + return PartialSpec->PartialSpecialization->getSpecializedTemplate(); + return SpecializedTemplate.get<ClassTemplateDecl*>(); +} + //===----------------------------------------------------------------------===// // ClassTemplatePartialSpecializationDecl Implementation //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index cb43f1c6a0d..ae16c7124c6 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -32,7 +32,7 @@ Sema::getTemplateInstantiationArgs(NamedDecl *D) { // Template arguments for a class template specialization. if (ClassTemplateSpecializationDecl *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) - return Spec->getTemplateArgs(); + return Spec->getTemplateInstantiationArgs(); // Template arguments for a function template specialization. if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) @@ -50,7 +50,7 @@ Sema::getTemplateInstantiationArgs(NamedDecl *D) { ClassTemplateSpecializationDecl *EnclosingTemplate = cast<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx); - return EnclosingTemplate->getTemplateArgs(); + return EnclosingTemplate->getTemplateInstantiationArgs(); } Sema::InstantiatingTemplate:: @@ -1011,6 +1011,7 @@ Sema::InstantiateClassTemplateSpecialization( // instantiation is generated from that specialization. Pattern = Matched[0].first; TemplateArgs = Matched[0].second; + ClassTemplateSpec->setInstantiationOf(Matched[0].first, Matched[0].second); } else if (Matched.size() > 1) { // -- If more than one matching specialization is found, the // partial order rules (14.5.4.2) are used to determine |

