[cfe-dev] RecursiveASTVisitor Behavior
Michael Chiu via cfe-dev
cfe-dev at lists.llvm.org
Thu Mar 18 09:51:21 PDT 2021
Silly me, that was my mistake.
Appreciate the help!
On Thu, Mar 18, 2021 at 9:42 AM David Rector <davrecthreads at gmail.com>
wrote:
> 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>
> wrote:
>
>>
>>
>> On Mar 18, 2021, at 11:42 AM, Michael Chiu via cfe-dev <
>> 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
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>> --
> M.
>
>
> --
M.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20210318/b9514d92/attachment-0001.html>
More information about the cfe-dev
mailing list