[cfe-dev] Distinguishing between implicit and explicit bool to int casts
David Blaikie via cfe-dev
cfe-dev at lists.llvm.org
Mon May 9 13:18:30 PDT 2016
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' <IntegralCast>
| `-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.
On Mon, May 9, 2016 at 1:15 PM, Michael Layzell via cfe-dev <
cfe-dev at lists.llvm.org> wrote:
> 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:
>
> `-DeclStmt 0x7fae2407a118 <line:51:3, col:30>
> `-VarDecl 0x7fae2407a050 <col:3, col:26> col:7 x 'int' cinit
> `-CStyleCastExpr 0x7fae2407a0f0 <col:21, col:26> 'int' <NoOp>
> `-ImplicitCastExpr 0x7fae2407a0d8 <col:26> 'int' <IntegralCast>
> `-CXXBoolLiteralExpr 0x7fae2407a0b0 <col:26> '_Bool' true
>
> How should I distinguish between the two forms reliably, such that
> explicit casts are never matched, but implicit casts are matched, when an
> explicit cast still inserts an implicit cast, and then just becomes a NoOp?
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160509/90ab612f/attachment.html>
More information about the cfe-dev
mailing list