[bugfix] Ensure nodes aren't cloned multiple times #2975
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
AstCloner
previously attempted to prevent double-cloning by checking theold_to_new_
mapping insideVisitChildren
. However, this missed the case whereReplaceOrVisit
was invoked directly on a node. In such cases, the same node could be cloned multiple times, breaking semantics.For example, with the following code, the old logic would incorrectly produce distinct type entities for the argument and return type in the clone:
This PR fixes the issue by moving the
old_to_new_
check intoReplaceOrVisit
and ensures nodes are only cloned once regardless of how they are visited.This change revealed another bug:
HandleTestFunction
andHandleTestProc
were not usingCastIfNotVerbatim
and would cause failure in the formatter test suite. This pull request make it consistent with existing implementations likeHandleFunction
and fixed the test failure.