SherAndrei wrote:

 > Will any of the new tests trigger the bug?
 
 Yes, two of them do fail if no suggested changes are present. Feel free to 
reproduce it yourself. 
 
 ```bash
./tools/clang/unittests/Tooling/ToolingTests 
--gtest_filter=*Transform*RewriteDescendantsApplyFirst*
 ```
 yields
 ```diff
Note: Google Test filter = *Transform*RewriteDescendantsApplyFirst*
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from TransformerTest
[ RUN      ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleUnrelated
/root/clang-llvm/llvm-project/clang/unittests/Tooling/TransformerTest.cpp:94: 
Failure
Expected equality of these values:
  format(Expected)
    Which is: "int f(int x) {\n  char y = 3;\n  return 3;\n}"
  format(Actual)
    Which is: "int f(int x) {\n  3 y = 3;\n  return 3;\n}"
With diff:
@@ -1,4 +1,4 @@
 int f(int x) {
-  char y = 3;
+  3 y = 3;
   return 3;
 }


[  FAILED  ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleUnrelated 
(17 ms)
[ RUN      ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleRelated
/root/clang-llvm/llvm-project/clang/unittests/Tooling/TransformerTest.cpp:94: 
Failure
Expected equality of these values:
  format(Expected)
    Which is: "int f(int x) {\n  int y = 3;\n  return y;\n}"
  format(Actual)
    Which is: "int f(int x) {\n  int y = y;\n  return y;\n}"
With diff:
@@ -1,4 +1,4 @@
 int f(int x) {
-  int y = 3;
+  int y = y;
   return y;
 }


[  FAILED  ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleRelated (14 
ms)
[ RUN      ] 
TransformerTest.RewriteDescendantsApplyFirstOrderedRuleRelatedSwapped
[       OK ] 
TransformerTest.RewriteDescendantsApplyFirstOrderedRuleRelatedSwapped (13 ms)
[----------] 3 tests from TransformerTest (45 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (45 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 2 tests, listed below:
[  FAILED  ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleUnrelated
[  FAILED  ] TransformerTest.RewriteDescendantsApplyFirstOrderedRuleRelated

 2 FAILED TESTS
 ```
 

 > Can you clarify where the matchers associated with the nested rule will be 
 > shifted? As far as I can tell, the original match uses Tag0 but happens in a 
 > separate context (that is, MatchFinder) than the nested match so I don't see 
 > how they are interacting.
  
 Yes, indeed the original match happens in separate context, but all contexts 
share one `NodesMap`, 
 which values are overriden with a consecutive match ('clash'). Let's consider 
test 
 `RewriteDescendantsApplyFirstOrderedRuleUnrelated` before suggested changes:
 
 1. `Transformer::registerMatchers` calls to `taggedMatchers`: `FunctionDecl` 
matcher, we'll call it FD, receives "Tag0",
 2. then `ApplyRuleCallback::registerMatchers` calls to `taggedMatchers`: first 
`DeclRefExpr` matcher, let's call it DRE1, receives "Tag0", second 
`DeclRefExpr` matcher -- DRE2 -- receives "Tag1",
 3. when DRE1 matches, `ApplyRuleCallback::run` calls to `findSelectedCase`: it 
successfully finds "Tag0" which is bound to FD and not to expected DRE1.

Now let's consider same test with suggested changes

 1. `Transformer::registerMatchers` binds FD to "Tag93825274205568",
 2. `ApplyRuleCallback::registerMatchers` binds DRE1 to "Tag93825274195136", 
DRE2 to "Tag93825274196288",
 3. when DRE1 matches, `findSelectedCase` finds expected DRE1 by searching for 
"Tag93825274195136"
 
Sorry for misleading you by using the word 'shifted' here. Nothing is shifted 
here really. I do struggle to update description of the commit. What do you 
think about next description of the commit:

```
[clang][transformer] Allow usage of applyFirst with rewriteDescendants

Previously,, `taggedMatchers` could apply same tag to two different matchers 
(here, for enclosing matcher and for first from `applyFirst`). 
We fix this by making sure that associated Tags are unique and deterministic as 
they are intend to be.
```


https://github.com/llvm/llvm-project/pull/117658
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to