[cfe-dev] [Clang-tidy] Detecting if a catch was done by const ref

Aaron Ballman via cfe-dev cfe-dev at lists.llvm.org
Fri Mar 16 12:59:07 PDT 2018


On Fri, Mar 16, 2018 at 3:40 PM, Matthieu Brucher via cfe-dev
<cfe-dev at lists.llvm.org> wrote:
>
>
> Le 12 mars 2018 17:59, "Aaron Ballman via cfe-dev" <cfe-dev at lists.llvm.org>
> a écrit :
>
> I believe the matcher you're looking for is:
> varDecl(hasType(references(qualType(isConstQualified()))))
>
> For example, given:
>
> void f1() {
>   try {
>   } catch (int &e) {
>   }
> }
>
> void f2() {
>   try {
>   } catch (const int &e) {
>   }
> }
>
> produces:
>
> clang-query> match
> varDecl(hasType(references(qualType(isConstQualified()))))
>
> Match #1:
>
> C:\Users\Aaron\Desktop\test.cpp:9:12: note: "root" binds here
>   } catch (const int &e) {
>            ^~~~~~~~~~~~
> 1 match.
>
> ~Aaron
>
> On Mon, Mar 12, 2018 at 2:12 AM, Richard via cfe-dev
> <cfe-dev at lists.llvm.org> wrote:
>> [Please reply *only* to the list and do not include my email directly
>> in the To: or Cc: of your reply; otherwise I will not see your reply.
>> Thanks.]
>>
>> In article
>> <CAHCaCkKdVLA-Mvg6i8BLAURRAeFfq5_GSGc6NmY3bEjRPpXq3Q at mail.gmail.com>,
>>     Matthieu Brucher via cfe-dev <cfe-dev at lists.llvm.org> writes:
>>
>>> 2018-03-11 21:26 GMT+00:00 Richard via cfe-dev <cfe-dev at lists.llvm.org>:
>>>
>>> > Have you tried prototyping with clang-query?
>>> >
>>>
>>> I know how to use it to create the query, but that's it. And even then, I
>>> can only do basic query, as I don't know where to find documentation on
>>> the
>>> specifics.
>>> It's possible to use for "dematching"? The ideal would be to select all
>>> catch statements that are not const&, but there are no example anywhere
>>> on
>>> that kind of selection.
>>
>> I confess that I find the type related matchers confusing and I'm
>> never quite sure how to use them.  If you look at the matcher
>> reference <http://clang.llvm.org/docs/LibASTMatchersReference.html>
>> you'll see a matcher for isExceptionVariable which is how you match
>> variable declarations in a catch statement.  (Maybe the matcher name
>> here isn't the best.)
>>
>>         c:\tmp
>>         > copy con: tmp.cpp
>>         #include <stdexcept>
>>
>>         void f()
>>         {
>>           try {
>>                 g();
>>           } catch (std::exception &e) {
>>                 throw;
>>           }
>>         }
>>         ^Z
>>                         1 file(s) copied.
>>
>>         c:\tmp
>>         > clang-query tmp.cpp --
>>         clang-query> match varDecl(isExceptionVariable())
>>
>>         Match #1:
>>
>>         c:\tmp\tmp.cpp:9:12: note: "root" binds here
>>           } catch (std::exception &e) {
>>                            ^~~~~~~~~~~~~~~~~
>>         1 match.
>>         clang-query>
>>
>> The part that always confuses me about the matchers is how to modify
>> matchers that find statements or declarations to qualify the matches
>> by aspects of the associated type.
>>
>> Here we want to narrow the varDecl() so that the type of the variable
>> is reference but not reference to const.  Frankly, I have never
>> figured out how to do that in clang-query and I'd love for someone to
>> enlighten me :)
>
>
> Seems like this query also matches function arguments. I suppose I have to
> use a condition saying that the previous or parent statement is catch?

It will match all variable declarations. For just catch arguments, I
think you will want:

varDecl(isExceptionVariable(),
hasType(references(qualType(isConstQualified()))))

~Aaron

>
> Matthieu
>
>
>> --
>> "The Direct3D Graphics Pipeline" free book
>> <http://tinyurl.com/d3d-pipeline>
>>             The Terminals Wiki <http://terminals-wiki.org>
>>      The Computer Graphics Museum <http://ComputerGraphicsMuseum.org>
>>   Legalize Adulthood! (my blog) <http://LegalizeAdulthood.wordpress.com>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>



More information about the cfe-dev mailing list