diff options
-rw-r--r-- | include/clang/AST/RecursiveASTVisitor.h | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 8512ccda28..7a2a044c5f 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -890,16 +890,19 @@ DEF_TRAVERSE_DECL(CXXRecordDecl, { }) DEF_TRAVERSE_DECL(ClassTemplateSpecializationDecl, { - // FIXME: we probably want to traverse the TemplateArgumentLoc for - // explicitly-written specializations and instantiations, rather - // than the computed template arguments. - const TemplateArgumentList &TAL = D->getTemplateArgs(); - for (unsigned I = 0; I < TAL.size(); ++I) { - TRY_TO(TraverseTemplateArgument(TAL.get(I))); - } - // FIXME: I think we only want to traverse this if it's an explicit - // specialization. - TRY_TO(TraverseCXXRecordHelper(D)); + // For implicit instantiations ("set<int> x;"), we don't want to + // recurse at all, since the instatiated class isn't written in + // the source code anywhere. (Note the instatiated *type* -- + // set<int> -- is written, and will still get a callback of + // TemplateSpecializationType). For explicit instantiations + // ("template set<int>;"), we do need a callback, since this + // is the only callback that's made for this instantiation. + // We use getTypeAsWritten() to distinguish. + // FIXME: see how we want to handle template specializations. + TypeSourceInfo* TSI = D->getTypeAsWritten(); + if (TSI) + TRY_TO(TraverseType(TSI->getType())); + return true; }) template <typename Derived> |