<div dir="ltr">Hi Nathan,<div><br></div><div>Thanks for bringing these to my attention. I just took a look at these modules and I think currently I have a few things implemented that these don't:</div><div><br></div><div>1. This is the main code for <a href="https://github.com/llvm/llvm-project/blob/be20daa8ebcc5af8882839a5295b9069ef473dfa/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp">google-readability-casting</a>, and it currently actually implements some things incorrectly. One such example is that it doesn't take into account member-pointers during the const cast check. Another example is that for const cast they don't check the other qualifiers (const_cast isn't only for const). There are some things that they also don't provide such as const_cast<...>(static_cast<...>()) nestedness which is specified in the standard as a potential behavior of C-style casts. They also don't take into account that (member) function pointers qualifiers cannot be const-casted away, as according to the standard. They also don't check for clang's behavior when it comes to non-pedantic behavior (unrelated source and destination types for conversions with different qualifiers at the unrelated parts currently only emit a warning in clang). They also don't check for the existence of arrays (partial, fixed size, and VLA's when pedantic is turned off). There are more subtleties like private access specifiers being an extension to static_cast that they don't check for.<br></div><div><br></div><div>2. This is the main code for <a href="https://github.com/llvm/llvm-project/blob/e40a742a5008c5a4cf647c0ea805486498786393/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeCstyleCastCheck.cpp">cppcoreguidelines-pro-type-cstyle-cast</a>, and it has similar parts (some copy pasted to/from the google-readability-casting link), but it's mostly warning for downcasting of class types.</div><div><br></div><div>With regards to putting the tool into clang-tidy, I'm actually trying to do that right now and will have a separate patch. I want to keep some of the features (as described in the phab PR) for a standalone application, which is why I opened this patch first.<br></div><div><br></div><div>Best,</div><div>Ray</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 21, 2020 at 10:04 AM Nathan James <<a href="mailto:n.james93@hotmail.co.uk" target="_blank">n.james93@hotmail.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
Can I just ask what are the differences between this new tool and the<br>
'cppcoreguidelines-pro-type-cstyle-cast' and 'google-readability-<br>
casting' checks inside clang-tidy?<br>
<br>
~Nathan<br>
<br>
On Tue, 2020-10-20 at 21:52 -0700, Ray Zhang via cfe-dev wrote:<br>
> Hi everyone,<br>
> <br>
> I've always wanted to contribute to Clang, and a few months ago I was<br>
> looking at the documentations online and found this:<br>
> Ideas for new Tools<br>
> C++ cast conversion tool. Will convert C-style casts ((type) value)<br>
> to appropriate C++ cast (static_cast, const_cast or<br>
> reinterpret_cast).<br>
> <br>
> Well, I'm happy to say that after the few months I've finally<br>
> finished the tool and I'm excited to contribute this back to the<br>
> community. I also made sure to comply with clang's coding style and<br>
> quality standards. I would love it if anyone wants to review it/give<br>
> it a try. Here's my PR on Phabricator: <br>
> <a href="https://reviews.llvm.org/D89765" rel="noreferrer" target="_blank">https://reviews.llvm.org/D89765</a>. I will write a .rst in the docs<br>
> section about how to use in the same PR, but I'm hoping to split the<br>
> patch into three sections first (strategy to split it is discussed in<br>
> the link).<br>
> <br>
> Best,<br>
> Ray<br>
> <br>
> Addendum (A subset of functionalities)<br>
> Checking whether C-style cast was silently performing<br>
> static/reinterpret_casts/const_cast (or any combination)<br>
> const float* const* i;<br>
> (int**) i;<br>
> error: C style cast can be replaced by 'const_cast<int<br>
> **>(reinterpret_cast<const int *const *>(i))'<br>
>     (int**) i;<br>
>     ^~~~~~~~~<br>
>     const_cast<int **>(reinterpret_cast<const int *const *>(i))<br>
> <br>
> Checking whether C-style casts were impossible to turn into C++ style<br>
> casts:<br>
> on dependent type T emits the following:<br>
> error: C style cast cannot be converted into a C++ style cast<br>
>     (T) a;<br>
>     ^~~~~<br>
> <br>
> on private inheritance specifier:<br>
> struct A {};<br>
> class B: A {};<br>
> error: C style cast cannot be converted into a C++ style cast<br>
>     (B*)(a);<br>
>     ^~~~~~~<br>
> <br>
> Checking whether C-style casts are no-ops and can be removed<br>
> error: C style cast can be replaced by 'x'<br>
>     const int& y = (const int&) x;<br>
>                    ^~~~~~~~~~~~~~<br>
>                    x<br>
> <br>
> Fix all of the above<br>
> note: FIX-IT applied suggested code changes<br>
> <br>
> ... except in macros<br>
> warning: C style cast can be replaced by 'static_cast<int>(3.5f)'<br>
> (won't be fixed in macro)<br>
>     CC(int, 3.5f);<br>
> ~~~~^~~~~~~~~~~~<br>
> _______________________________________________<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="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br>
</blockquote></div>