<div dir="ltr">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.</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 13, 2016 at 11:50 AM, Michael Layzell <span dir="ltr"><<a href="mailto:michael@thelayzells.com" target="_blank">michael@thelayzells.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Indeed, there is a difference, but I don't understand why the implicit cast is occurring. I could theoretically look for the pattern of the no-op CStyleCastExpr around the ImplicitCastExpr, but that seems like a bit of a hack. The cast isn't really implicit in this situation I would think.<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 9, 2016 at 1:18 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">In C++ at least, there seems to be a difference:<br><br><div>|-VarDecl 0x7da9f60 <cast.cc:1:1, col:14> col:5 x 'int' cinit</div><div>| `-CStyleCastExpr 0x7daa040 <col:9, col:14> 'int' <NoOp></div><div>|   `-ImplicitCastExpr 0x7daa028 <col:14> 'int' <IntegralCast></div><div>|     `-CXXBoolLiteralExpr 0x7daa000 <col:14> '_Bool' true</div><div>`-VarDecl 0x7daa078 <line:2:1, col:9> col:5 y 'int' cinit</div><div>  `-ImplicitCastExpr 0x7daa0f0 <col:9> 'int' <IntegralCast></div><div>    `-CXXBoolLiteralExpr 0x7daa0d8 <col:9> '_Bool' true<br><br>One has a CStyleCastExpr, one doesn't.</div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Mon, May 9, 2016 at 1:15 PM, Michael Layzell via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><div><div><div><div>I was trying to write a clang static analysis for detecting implicit bool to int casts. Namely, I wanted to allow forms like:<br><br></div>int x = (int) true;<br><br></div>But disallow forms like:<br><br></div>int x = true;<br><br></div>Unfortunately, it seems like both of these generate implicit cast AST nodes, namely I get the following AST tree for the explicitly casted form:<br><br><pre>    `-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</pre>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?<br></div>
<br></div></div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>