[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