Getting the parent of CallExpr that has a VarDecl.


I am currently trying to get the parent statement of a CallExpr.

The statement looks like this

size_t size = json_array_size(element);

The AST looks like this

-FunctionDecl 0x560eb8d9e5e8 prev 0x560eb8d9a8a8 <line:101:1,

line:110:1> line:101:6 used print_json_array 'void (json_t *, int)'

>-ParmVarDecl 0x560eb8d9e4e0 <col:23, col:31> col:31 used element

'json_t *'

>-ParmVarDecl 0x560eb8d9e558 <col:40, col:44> col:44 used indent 'int'
`-CompoundStmt 0x560eb8d9efa8 <col:52, line:110:1>
>-DeclStmt 0x560eb8d9e870 <line:103:5, col:43>
> `-VarDecl 0x560eb8d9e748 <col:5, col:42> col:12 used size

'size_t':'unsigned long' cinit

> `-CallExpr 0x560eb8d9e810 <col:19, col:42> 'size_t':'unsigned long'
> >-ImplicitCastExpr 0x560eb8d9e7f8 <col:19> 'size_t (*)(const

json_t *)' <FunctionToPointerDecay>

> > `-DeclRefExpr 0x560eb8d9e7a8 <col:19> 'size_t (const json_t

*)' Function 0x560eb8d8ec38 'json_array_size' 'size_t (const json_t *)'

> `-ImplicitCastExpr 0x560eb8d9e858 <col:35> 'const json_t *'


> `-ImplicitCastExpr 0x560eb8d9e840 <col:35> 'json_t *'


> `-DeclRefExpr 0x560eb8d9e7d0 <col:35> 'json_t *' lvalue

ParmVar 0x560eb8d9e4e0 'element' 'json_t *'


The way I try to get the parent of a CallExpr once it meets the criteria
I am looking for

const clang::Stmt* Visitor::getParentStmt(const clang::Stmt *stmt){
auto it = astContext.getParents(*stmt).begin();
if(it == astContext.getParents(*stmt).end()) return nullptr;

const clang::Stmt \*aStmt = it\-&gt;get&lt;clang::Stmt&gt;\(\);
    auto parent = astContext\.getParents\(\*aStmt\)\.begin\(\);
    const clang::Stmt \*pStmt = parent\-&gt;get&lt;clang::Stmt&gt;\(\);
        return aStmt;
        return getParentStmt\(aStmt\);
//nothing worked
    llvm::errs\(\) &lt;&lt; &quot;Failed to get parent stmt for\\n&quot;;
return nullptr;


When a VarDecl is the direct ancestor of the CallExpr it fails to
traverse up.

Any ideas how I can overcome that ?