[LibTooling] Unable to parse cpp code when using libtooling feature

Hi,

I am a novice developer hacking around ways to use clang for parsing C/CPP code.

I am able to parse C code with clangs libtooling feature properly. But, when I use the code to parse CPP test code, I am getting the following error:

$ ./Main

test.cpp:1:1: error: unknown type name ‘template’

template

^

test.cpp:1:9: error: expected identifier or ‘(’

template

^

test.cpp:6:19: error: expected expression

float c = add(a, b);

^

test.cpp:6:15: error: use of undeclared identifier ‘add’

float c = add(a, b);

^

Attached: Main.mk (to build test), Main.cpp (Clang 8.0 based libtooling source), test.cpp (test case)

Please let me know if I am doing anything bad or missing something.

The Makefile assumes that clang is installed in ~/llvm80

Main.cpp (3.11 KB)

test.cpp (159 Bytes)

Main.mk (933 Bytes)

Those are typical of attempting to compile C++ code as C. I’m not sure what the right way to set the LangOpts on CompilerInstance in libclang is, but you likely need to update those to set LangOpts correctly for the version of C++ you intend to support…

Hi Keane,
Exactly my thoughts. But, how to do it?

https://stackoverflow.com/questions/38356485/how-do-i-put-clang-into-c-mode

Great! The post helped me figure out the right sequence of syntax to use.
Here is how I figured it out.
greped for LangOptions on clang/FrontEnd headers, found that CompilerInvocation takes LangOptions as an argument in one of its methods; CompilerInstance has a method to get its own instance of CompilerInvocation.

Hi,
On a second note, the code builds fine; but when I run the program it exits without any output. I added my own FunctionDecl visitor to MyRecursiveASTVisitor. I am guessing the code I am missing can be something to do with headers and methods which are tagged XX as prefix or suffix like, DeclXX.h or StmtXX.h or so.

Attached updated source code.

Main.cpp (3.53 KB)

Sorry. My bad.
The code at line 100 should be MyASTConsumer than clang::ASTConsumer.
Thank you!

Aditya,

In the call to setASTConsumer at line 99 should it not make an unique pointer of MyASTConsumer instead of clang::ASTConsumer?

ci.setASTConsumer(llvm::make_unique<clang::ASTConsumer>());

Good eye! Fixed it. Thank you!

Hi,
When I run the program, I am seeing the Function add is being visited once (even though called twice). Attached test case and source code.
Here is the output from the program:

In HandleTopLevelDecl

Visiting Function add it has: 2 arguments

The argument types are:

const T

const T

In HandleTopLevelDecl

Visiting Function foo it has: 0 arguments

The argument types are:

In HandleTopLevelDecl

Visiting Function main it has: 0 arguments

The argument types are:

In HandleTopLevelDecl

Visiting Function add it has: 2 arguments

The argument types are:

const float

const float

Main.cpp (3.58 KB)

test.cpp (198 Bytes)

Aditya,

You are implementing VisitFunctionDecl, which visits only function declarations, and not uses (e.g.: call expressions).

If you are interested in call expressions you can either implement VisitCallExpr or use an AST Matcher (https://clang.llvm.org/docs/LibASTMatchersTutorial.html).