4242#include < clang/Parse/ParseAST.h>
4343#include < clang/Sema/Sema.h>
4444#include < clang/Sema/SemaConsumer.h>
45+ #include < clang/Sema/Template.h>
4546#include < clang/Frontend/Utils.h>
4647#include < clang/Driver/Driver.h>
4748#include < clang/Driver/ToolChain.h>
@@ -3053,8 +3054,7 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType)
30533054 RD = const_cast <CXXRecordDecl*>(Type->getPointeeCXXRecordDecl ());
30543055 ClassTemplateSpecializationDecl* CTS;
30553056 if (!RD ||
3056- !(CTS = llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) ||
3057- CTS->isCompleteDefinition ())
3057+ !(CTS = llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)))
30583058 return ;
30593059
30603060 auto existingClient = c->getSema ().getDiagnostics ().getClient ();
@@ -3065,8 +3065,7 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType)
30653065 Scope Scope (nullptr , Scope::ScopeFlags::ClassScope, c->getSema ().getDiagnostics ());
30663066 c->getSema ().TUScope = &Scope;
30673067
3068- c->getSema ().InstantiateClassTemplateSpecialization (CTS->getBeginLoc (),
3069- CTS, TSK_ImplicitInstantiation, false );
3068+ InstantiateSpecialization (CTS);
30703069
30713070 c->getSema ().getDiagnostics ().setClient (existingClient, false );
30723071 c->getSema ().TUScope = nullptr ;
@@ -3082,6 +3081,32 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType)
30823081 }
30833082}
30843083
3084+ void Parser::InstantiateSpecialization (clang::ClassTemplateSpecializationDecl* CTS)
3085+ {
3086+ using namespace clang ;
3087+
3088+ if (!CTS->isCompleteDefinition ())
3089+ {
3090+ c->getSema ().InstantiateClassTemplateSpecialization (CTS->getBeginLoc (),
3091+ CTS, TSK_ImplicitInstantiation, false );
3092+ }
3093+
3094+ for (auto Decl : CTS->decls ())
3095+ {
3096+ if (Decl->getKind () == Decl::Kind::CXXRecord)
3097+ {
3098+ CXXRecordDecl* Nested = cast<CXXRecordDecl>(Decl);
3099+ CXXRecordDecl* Template = Nested->getInstantiatedFromMemberClass ();
3100+ if (Template && !Nested->isCompleteDefinition () && !Nested->hasDefinition ())
3101+ {
3102+ c->getSema ().InstantiateClass (Nested->getBeginLoc (), Nested, Template,
3103+ MultiLevelTemplateArgumentList (CTS->getTemplateArgs ()),
3104+ TSK_ImplicitInstantiation, false );
3105+ }
3106+ }
3107+ }
3108+ }
3109+
30853110Parameter* Parser::WalkParameter (const clang::ParmVarDecl* PVD,
30863111 const clang::SourceLocation& ParamStartLoc)
30873112{
0 commit comments