[cfe-dev] RecursiveASTVisitor Behavior

David Rector via cfe-dev cfe-dev at lists.llvm.org
Thu Mar 18 09:42:01 PDT 2021


You spell it `VistVarDecl` in the example, t

> On Mar 18, 2021, at 12:02 PM, Michael Chiu <chiumichel at gmail.com> wrote:
> 
> Hi David,
> 
> Thanks for the prompt reply. I should’ve been more clear but I am returning bool in all of the visitor method functions, but clang::VarDecl is still not visited which is why I’m so perplexed.
> 
> On Thu, Mar 18, 2021 at 8:58 AM David Rector <davrecthreads at gmail.com <mailto:davrecthreads at gmail.com>> wrote:
> 
> 
>> On Mar 18, 2021, at 11:42 AM, Michael Chiu via cfe-dev <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>> 
>> Hi All,
>> 
>> I have c code, below, that I'm trying to visit the AST of by using RecursiveASTVisitor. I'm trying to get the RecursiveASTVisitor to visit variable declarations (clang::VarDecl) by implementing bool VistVarDecl(clang::VarDecl *vardecl). However, the clang::VarDecl nodes are never visited even though I've managed to visit all the other nodes in the AST though. Moreover, using clang-query on test1.c I can match varDecl.
>> 
>> Does anyone know the clang::VarDecl nodes are the only nodes that aren't visited by the RecursiveASTVisitor but are matched by clang-query?
>> 
>> Thanks in advaince!
>> 
>> ```
>> double multiply(double x, double y) {
>>     return x * y * y;
>> }
>> 
>> int main(int argc, char const *argv[])
>> {
>>     double a;
>> 
>>     int b;
>> 
>>     float d;
>> 
>>     double x = 3.0;
>>     double y = 5.0;
>> 
>>     double z = multiply(x,y);
>> 
>>     return 0;
>> }
>> ```
>> My RecursiveASTVisitor is as follows:
>> ```
>> struct MyASTVisitor : public clang::RecursiveASTVistor<MyASTVisitor> {
>>   bool VistVarDecl(clang::VarDecl *vardecl) {
If this misspelling of VisitVarDecl is in your code that’s your culprit.
>>      llvm::outs() << "Found a VarDecl";
> 
> Add `return true;’ here and in the others.  (Traversal halts after the first false return, and all these are returning false by default.)
>>   };
>> 
>>   bool VisitFunctionDecl(clang::FunctionDecl *decl) {
>>      llvm::outs() << "Found a FunctionDecl";
>>   };
>> 
>>   // other functions implemented similarly just to see if it visits properly
>>   bool VisitParmVarmDecl(clang::ParmVarDecl *paramvardecl);
>>   bool VisitCallExpr(clang::CallExpr *callexpr);
>>   bool VisitImplicitCastExpr(clang::ImplicitCastExpr *castexpr);
>>   bool VisitBinaryOperator(clang::BinaryOperator *bo);
>>   bool VisitDeclStmt(clang::DeclStmt *declstmt);
>>   bool VisitDeclRefExpr(clang::DeclRefExpr *declrefexpr);
>>   bool VisitFloatingLiteral(clang::FloatingLiteral *floatliteral);
>> };
>> 
>> struct MyASTConsumer : public clang::ASTConsumer {
>> 
>>   bool HandleTopLevelDecl(clang::DeclGroupRef DR) override {
>>     for (clang::DeclGroupRef::iterator b = DR.begin(), e = DR.end(); b != e; ++b) {
>>         Visitor.TraverseDecl(*b);
>>      }
>>      return true;
>>   }
Also, in your case, since you’re always returning true from your Handle* implem, might be simpler to instead write:
```
void HandleTranslationUnit(ASTContext &Context) override {
  Visitor.TraverseDecl(Context.getTranslationUnitDecl());
}
```
Though that should not make a difference with your problem.

>> private: 
>>   MyASTVisitor Visitor;
>> };
>> ```
>> 
>> -- 
>> Michael.
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev <https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
> 
> -- 
> M.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20210318/53832634/attachment.html>


More information about the cfe-dev mailing list