bool type is represented as "_Bool" in the AST

Dear Clang-developer community,
I am using libTooling to query information about the source. While querying the string representation of the bool type, I get “_Bool” string. I got the string from QualType::getAsString(). Should I be using another function to query the actual type or is it an expected behavior?

I don’t get _Bool when dumping the ast except when I dump the QualType Node.

clang Version: 9.0
LLVM Version: 9.0

Regards,
Pradeep

Are you compiling as C, or c++? C++ should give you “bool”, since it is the type, however if you’re using C, “bool” is likely typedef’ed to “_Bool”, so that’s the type you’re getting.

Dear Keane,
I am running through CUDA code. The AST nodes as far as I can see is more like C++ like CXXRecordDecl and so on. I do pass C++ standard flag to the tool.

Regrads,
Pradeep

Dear Clang-developer community,
    I am using libTooling to query information about the source. While querying the string representation of the bool type, I get "_Bool" string. I got the string from QualType::getAsString(). Should I be using another function to query the actual type or is it an expected behavior?

    I don't get _Bool when dumping the ast except when I dump the QualType Node.

The PrintingPolicy::Bool member dictates this behavior.

~Aaron

Dear Aaron,
Why is it set to “_Bool” by default? How do I change it?

Regards,
Pradeep

Dear Aaron,
    Why is it set to "_Bool" by default?

It seems to get its default value from LangOptions::Bool, which I
believe is set automatically by the language standard mode.

How do I change it?

Usually you do this by making a copy of an existing PrintingPolicy
object and modifying it.

PrintingPolicy PP(WhateverPrintingPolicyYouWereUsing);
PP.Bool = 1;

Then pass PP into the call to getAsString().

~Aaron

Dear Aaron,
How do I set it from command line? I am remeber setting the language standard as -std=c++17 in the clangTool.

Regards,
Pradeep

Dear Aaron,
   How do I set it from command line? I am remeber setting the language standard as -std=c++17 in the clangTool.

You don't change it via the command line. If you set the language mode
to C++ in Clang, it should always print as bool automatically. See
CompilerInvocation::setLangDefaults(), where it sets the values for
the LangOptions object used to make printing policies. If you're not
executing Clang, we need more information about how you are setting up
the tool to be able to help.

~Aaron

I noticed that too recently:

$ cat f.cmds

set print-matcher true

m functionDecl(returns(asString("int")))

m functionDecl(returns(asString("bool")))

m functionDecl(returns(asString("_Bool")))
$ cat foo.cpp

int foo();

bool bar();
$ clang-query -f f.cmds foo.cpp -- -std=c++17

   Matcher: functionDecl(returns(asString("int")))

Dear Aaron,
For the sake of clarity, I have detailed about the case in here. I just want to know is this the expected behavior from the tool.

Regards,
Pradeep

Gist link: https://gist.github.com/schwarzschild-radius/8986bd5dc734183727291b3f3aae4c53

Dear Aaron,
   For the sake of clarity, I have detailed about the case in here. I just want to know is this the expected behavior from the tool.

Expected: no. Explainable: yes.

var_decl->getType().dump(); calls the default dumper on QualType. This
creates an ASTDumper object from llvm::errs() and two null pointers
(see ASTDumper.cpp:164). This ASTDumper constructor constructs a
PrintingPolicy object from a default-constructed LangOptions object
rather than using the one from the ASTContext (see ASTDumper.h:32),
which is why you're getting the behavior you are.

There is no QualType::dump() interface that lets you pass in a
printing policy. I would have expected the QualType dumper to use the
correct printing policy, like the Decl dumper does, which is why I
think this is unexpected.

~Aaron