diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1774,13 +1774,8 @@ TRY_TO(TraverseDecl(RD)); break; - // FIXME: For now traverse explicit instantiations here. Change that - // once they are represented as dedicated nodes in the AST. case TSK_ExplicitInstantiationDeclaration: case TSK_ExplicitInstantiationDefinition: - TRY_TO(TraverseDecl(RD)); - break; - case TSK_ExplicitSpecialization: break; } @@ -2127,6 +2122,15 @@ } } + switch(D->getTemplateSpecializationKind()) { + case TSK_ExplicitInstantiationDeclaration: + case TSK_ExplicitInstantiationDefinition: + VisitBody = false; + break; + default: + break; + } + if (VisitBody) { TRY_TO(TraverseStmt(D->getBody())); // Body may contain using declarations whose shadows are parented to the diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -10324,7 +10324,7 @@ : Specialization->getInstantiatedFromMemberFunction(), D.getIdentifierLoc(), D.getCXXScopeSpec().isSet(), TSK); - // FIXME: Create some kind of ExplicitInstantiationDecl here. + CurContext->addDecl(Specialization); return (Decl*) nullptr; }