Distinguishing between implicit and explicit bool to int casts

I was trying to write a clang static analysis for detecting implicit bool to int casts. Namely, I wanted to allow forms like:

int x = (int) true;

But disallow forms like:

int x = true;

Unfortunately, it seems like both of these generate implicit cast AST nodes, namely I get the following AST tree for the explicitly casted form:

In C++ at least, there seems to be a difference:

-VarDecl 0x7da9f60 <cast.cc:1:1, col:14> col:5 x ‘int’ cinit
-CStyleCastExpr 0x7daa040 <col:9, col:14> 'int' <NoOp> -ImplicitCastExpr 0x7daa028 col:14 ‘int’
-CXXBoolLiteralExpr 0x7daa000 <col:14> '_Bool' true -VarDecl 0x7daa078 <line:2:1, col:9> col:5 y ‘int’ cinit
-ImplicitCastExpr 0x7daa0f0 <col:9> 'int' <IntegralCast> -CXXBoolLiteralExpr 0x7daa0d8 col:9 ‘_Bool’ true

One has a CStyleCastExpr, one doesn’t.

It’s a bit of a quirk of Clang’s AST representation, to be sure - but, yeah, basically I think you have to check that there’s no explicit cast around the implicit cast to find the things you’re looking for.