[cfe-dev] ASTMatcher unexpected result
Hartogs Siegfried via cfe-dev
cfe-dev at lists.llvm.org
Tue Oct 6 13:50:09 PDT 2020
Hi Nathan, thanks for your swift answer.
the binary works nicely on 11.0.0-rc5 on Apple.
Best, Siegfried
> On 6Oct, 2020, at 20:31, Nathan James <n.james93 at hotmail.co.uk> wrote:
>
> Hi Siegfried,
>
> I believe this bug was fixed in https://reviews.llvm.org/D80025. A
> quick check against trunk clang-query shows correct behaviour no matter
> which order the submatchers appear.
>
> Can you please check against trunk(or latest release
> candidate(currently RC5) on your end. The patch was landed before the
> 11 branch was created so it should be good there.
>
> ~Nathan
>
> On Tue, 2020-10-06 at 10:25 +0000, Hartogs Siegfried via cfe-dev wrote:
>
>
>> Hi everyone,
>>
>> I'm trying to use AST Matchers in clang-query to find single-depth
>> for-loops,
>> i.e. for-loops that are neither contained in any other for-loop nor
>> contain for-loops themselves.
>>
>> Approach:
>> forStmt( unless(hasAncestor(forStmt())),
>> unless(hasDescendant(forStmt())) )
>>
>>
>> In the following code, I want it to match only the loop in foo1, but
>> unfortunately it also matches the loop in foo2.
>>
>>
>> void foo1(){ int n = 10; for(int i1=0; i1<n; i1++){ // dosomething();
>> } } void foo2(){ int n = 10; for(int i21=0; i21<n; i21++){
>> for(int i22=0; i22<n; i22++){ // dosomething(); } } }
>>
>>
>> Match #1:
>> ~/cq.cpp:4:5: note: "root" binds here
>> for(int i1=0; i1<n; i1++){
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> Match #2:
>> ~/cq.cpp:11:5: note: "root" binds here
>> for(int i21=0; i21<n; i21++){
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 2 matches.
>>
>> When I interchange "hasAncestor" and "hasDescendant" in the matcher,
>> the second match changes:
>>
>>
>> Match #1:
>> ~/cq.cpp:4:5: note: "root" binds here
>> for(int i1=0; i1<n; i1++){
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> Match #2:
>> ~/cq.cpp:11:5: note: "root" binds here
>> for(int i22=0; i21<n; i22++){
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 2 matches.
>>
>> To me, it doesn't make sense why the result changes (implicit allOf()
>> matcher's argument order shouldn't matter), but I don't understand
>> why the matcher returns a loop from foo2 in the first place.
>>
>> Best regards,
>> Siegfried Hartogs
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
More information about the cfe-dev
mailing list