lukasza added inline comments. ================ Comment at: include/clang/AST/RecursiveASTVisitor.h:1728 @@ -1708,2 +1727,3 @@ + TRY_TO(TraverseDeclTemplateParameterLists(D)); TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); ---------------- I think that tweaks of EnumDecl traversal together with tweaks of TraverseRecordHelper tweaks, take care of all the relevant node types derived from TagDecl:
- EnumDecl - traversal now calls TraverseDeclTemplateParameterLists (+EnumDecl is covered by the new unit tests) - RecordDecl - TraverseRecordHelper now calls TraverseDeclTemplateParameterLists (+RecordDecl is covered by the new unit tests) - CXXRecordDecl - traversal includes a call to TraverseRecordHelper I believe that nodes derived further from CXXRecordDecl cannot have a template parameter list (?): - ClassTemplateSpecializationDecl - ClassTemplatePartialSpecializationDecl If this is not correct, then can you please help me see the shape of unit tests that would cover these nodes? ================ Comment at: include/clang/AST/RecursiveASTVisitor.h:1823 @@ -1802,2 +1822,3 @@ bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) { + TRY_TO(TraverseDeclTemplateParameterLists(D)); TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); ---------------- I think that TraverseDeclaratorHelper together with TraverseFunctionHelper tweaks, this takes care of all node types derived from DeclaratorDecl: - FieldDecl - traversal calls TraverseDeclaratorHelper - FunctionDecl - traversal calls TraverseFunctionHelper - CXXMethodDecl - traversal calls TraverseFunctionHelper (+CXXMethodDecl is covered by the new unit tests) - CXXConstructorDecl - traversal calls TraverseFunctionHelper - CXXConversionDecl - traversal calls TraverseFunctionHelper - CXXDestructorDecl - traversal calls TraverseFunctionHelper - VarDecl - TraverseVarHelper calls TraverseDeclaratorHelper (+VarDecl is covered by the new unit tests) I believe that nodes derived further from VarDecl cannot have a template parameter list (?), but most of them should still be safe (because their traversal goes through TraverseVarHelper): - DecompositionDecl - traversal calls TraverseVarHelper - ImplicitParamDecl - traversal calls TraverseVarHelper - OMPCapturedExprDecl - traversal calls TraverseVarHelper - ParmVarDecl - traversal calls TraverseVarHelper - VarTemplateSpecializationDecl - VarTemplatePartialSpecializationDecl Please let me know if I am wrong above and it is indeed possible to have template parameter lists next to VarTemplateSpecializationDecl and/or VarTemplatePartialSpecializationDecl (and I would also appreciate if you could help me see the shape of unit tests that would cover these nodes). ================ Comment at: include/clang/AST/RecursiveASTVisitor.h:1870 @@ -1848,2 +1869,3 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) { + TRY_TO(TraverseDeclTemplateParameterLists(D)); TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); ---------------- Richard, in https://llvm.org/bugs/show_bug.cgi?id=29042#c6 you've suggested reusing TraverseDeclaratorHelper here. I agree that there are refactoring and code reusing opportunities here (e.g. TraverseNestedNameSpecifier[Loc] are getting called from both TraverseDeclaratorHelper and from TraverseFunctionHelper), but I didn't pursue them in this patch, because I was worried about little details: 1. traversal order (i.e. TraverseDeclaratorHelper traverses NestedNameSpecifier immediately before traversing TypeSourceInfo; this is different than TraverseFunctionHelper which traverses DeclarationNameInfo in-between traversing NestedNameSpecifier and TypeSourceInfo) 2. traversal in absence of TypeSourceInfo (i.e. when TypeSourceInfo is missing, then TraverseDeclaratorHelper traverses Type; this is different than TraverseFunctionHelper which in this case 1) checks shouldVisitImplicitCode condition and only then 2) traverses function parameters). Because of the above, I think that for now it is better to call TraverseDeclTemplateParameterLists directly from TraverseFunctionHelper, rather than trying to reuse the whole (or bigger part of) TraverseDeclaratorHelper from TraverseFunctionHelper. ================ Comment at: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp:1730 @@ +1729,3 @@ + return type && InnerMatcher.matches(*type, Finder, Builder); +} + ---------------- I've needed this custom AST matcher in https://codereview.chromium.org/2256913002 - let me try to sneak in a question related to this other CL: Can I somehow avoid introducing a new, custom AST matcher? (i.e. is it possible to express hasUnderlyingType in terms of built-in matchers?) https://reviews.llvm.org/D24268 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits