diff options
author | Nicolas van Kempen <nvankemp@gmail.com> | 2024-08-20 11:44:13 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-20 11:44:13 -0400 |
commit | f9e2a86b2e852dbed027e6aea5b48f32f2415b13 (patch) | |
tree | b050796f9caa345394eae269a6dac41736842663 /llvm/lib/Object/MachOObjectFile.cpp | |
parent | 90a8e5a7ac52d05c2331f0f3d1461fcab6b7d520 (diff) | |
download | llvm-f9e2a86b2e852dbed027e6aea5b48f32f2415b13.zip llvm-f9e2a86b2e852dbed027e6aea5b48f32f2415b13.tar.gz llvm-f9e2a86b2e852dbed027e6aea5b48f32f2415b13.tar.bz2 |
[clang][ASTMatcher] Fix execution order of hasOperands submatchers (#104148)
`hasOperands` does not always execute matchers in the order they are
written. This can cause issue in code using bindings when one operand
matcher is relying on a binding set by the other. With this change, the
first matcher present in the code is always executed first and any
binding it sets are available to the second matcher.
Simple example with current version (1 match) and new version (2
matches):
```bash
> cat tmp.cpp
int a = 13;
int b = ((int) a) - a;
int c = a - ((int) a);
> clang-query tmp.cpp
clang-query> set traversal IgnoreUnlessSpelledInSource
clang-query> m binaryOperator(hasOperands(cStyleCastExpr(has(declRefExpr(hasDeclaration(valueDecl().bind("d"))))), declRefExpr(hasDeclaration(valueDecl(equalsBoundNode("d"))))))
Match #1:
tmp.cpp:1:1: note: "d" binds here
int a = 13;
^~~~~~~~~~
tmp.cpp:2:9: note: "root" binds here
int b = ((int)a) - a;
^~~~~~~~~~~~
1 match.
> ./build/bin/clang-query tmp.cpp
clang-query> set traversal IgnoreUnlessSpelledInSource
clang-query> m binaryOperator(hasOperands(cStyleCastExpr(has(declRefExpr(hasDeclaration(valueDecl().bind("d"))))), declRefExpr(hasDeclaration(valueDecl(equalsBoundNode("d"))))))
Match #1:
tmp.cpp:1:1: note: "d" binds here
1 | int a = 13;
| ^~~~~~~~~~
tmp.cpp:2:9: note: "root" binds here
2 | int b = ((int)a) - a;
| ^~~~~~~~~~~~
Match #2:
tmp.cpp:1:1: note: "d" binds here
1 | int a = 13;
| ^~~~~~~~~~
tmp.cpp:3:9: note: "root" binds here
3 | int c = a - ((int)a);
| ^~~~~~~~~~~~
2 matches.
```
If this should be documented or regression tested anywhere please let me
know where.
Diffstat (limited to 'llvm/lib/Object/MachOObjectFile.cpp')
0 files changed, 0 insertions, 0 deletions