<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/71890>71890</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Created CallExpr has its DeclRefExpr replaced using Visitor pattern
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          SaltyPhoti
      </td>
    </tr>
</table>

<pre>
    Crash trace: 
```
Stack dump:
0.      Program arguments: ./clang -rewrite-pflow -fopenmp /home/litianying/test.c -o test-rw.c
 #0 0x00005567acf6e444 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00005567acf6c26c llvm::sys::CleanupOnSignal(unsigned long) (./clang+0x384b26c)
 #2 0x00005567acea9fd8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007fdd6ebc6420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00005567b026e3d9 clang::Stmt::getEndLoc() const (./clang+0x6b4d3d9)
 #5 0x00005567b026eb6d clang::Stmt::getSourceRange() const (./clang+0x6b4db6d)
 #6 0x00005567b02d3fd3 clang::TextNodeDumper::Visit(clang::Stmt const*) (./clang+0x6bb2fd3)
 #7 0x00005567aff087b2 clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()::operator()() const (./clang+0x67e77b2)
 #8 0x00005567aff091c5 std::_Function_handler<void (bool), void clang::TextTreeStructure::AddChild<clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'())::'lambda'(bool)>::_M_invoke(std::_Any_data const&, bool&&) (./clang+0x67e81c5)
 #9 0x00005567aff091fe std::_Function_handler<void (bool), void clang::TextTreeStructure::AddChild<clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'())::'lambda'(bool)>::_M_invoke(std::_Any_data const&, bool&&) (./clang+0x67e81fe)
#10 0x00005567aff08ac8 void clang::TextTreeStructure::AddChild<clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()) (./clang+0x67e7ac8)
#11 0x00005567aff088d1 clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()::operator()() const (./clang+0x67e78d1)
#12 0x00005567aff091c5 std::_Function_handler<void (bool), void clang::TextTreeStructure::AddChild<clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::'lambda'())::'lambda'(bool)>::_M_invoke(std::_Any_data const&, bool&&) (./clang+0x67e81c5)
#13 0x00005567aff0e1b6 std::_Function_handler<void (bool), void clang::TextTreeStructure::AddChild<clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::'lambda'()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::'lambda'())::'lambda'(bool)>::_M_invoke(std::_Any_data const&, bool&&) (./clang+0x67ed1b6)
#14 0x00005567aff21ec6 clang::Decl::dump(llvm::raw_ostream&, bool, clang::ASTDumpOutputFormat) const (./clang+0x6800ec6)
#15 0x00005567aeff50eb clang::SourceTransformAction::ExecuteAction() (./clang+0x58d40eb)
#16 0x00005567ada97b11 clang::FrontendAction::Execute() (./clang+0x4376b11)
#17 0x00005567ada1ece3 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (./clang+0x42fdce3)
#18 0x00005567adb7af7b clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (./clang+0x4459f7b)
#19 0x00005567aa8c77b4 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (./clang+0x11a67b4)
#20 0x00005567aa8c0d5b ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#21 0x00005567ad888559 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#22 0x00005567aceaa0d7 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (./clang+0x37890d7)
#23 0x00005567ad888b4c clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#24 0x00005567ad85293e clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (./clang+0x413193e)
#25 0x00005567ad85335d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (./clang+0x413235d)
#26 0x00005567ad85e1ac clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (./clang+0x413d1ac)
#27 0x00005567aa8c5539 clang_main(int, char**) (./clang+0x11a4539)
#28 0x00007fdd6e644083 __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:342:3
#29 0x00005567aa8c096e _start (./clang+0x119f96e)
```
Relavant code:
(Create CallExpr)
```
CallExpr *MyNodeCreater::CreateCall() {
    std::string FuncName = "Func";
    QualType T = getContext().getFunctionType(getContext().UnsignedIntTy, {getContext().VoidTy}, {});
    DeclarationName N =
 DeclarationName(&(getContext().Idents).get(PtoolsStartFuncName));
 FunctionDecl *FD= FunctionDecl::Create(
        getContext(), getContext().getTranslationUnitDecl(), SourceLocation(),
 SourceLocation(), N, T, nullptr, SC_Extern);
    // add extern func
 FD->setDeclContext(getContext().getTranslationUnitDecl());
    Expr *funcExpr= DeclRefExpr::Create(getContext(), NestedNameSpecifierLoc(), SourceLocation(), FD,
                                            false, SourceLocation(), FD->getType(), VK_LValue);
    CallExpr *callExpr= CallExpr::Create(
        getContext(), funcExpr, None, getContext().VoidTy, VK_LValue, SourceLocation(), FPOptionsOverride());
 return callExpr;
}
```
(Visit function)
```
    DeclNode VisitFunctionDecl(FunctionDecl *D) override {
      FunctionDecl *NewFD = nullptr;
      DeclarationName N = D->getNameInfo().getName();
 QualType T = D->getType();
      ASTContext &Ctx = getContext();
 NewFD = FunctionDecl::Create(Ctx, Ctx.getTranslationUnitDecl(), 
 SourceLocation(), SourceLocation(), N, T, nullptr, SC_None);
      NewFD->setDeclContext(Ctx.getTranslationUnitDecl());
 PToolsAstNodeCreator astNodeCreator(getContext());

      // std::cout << "N name getAsString: " << N.getAsString() << " ------------------\n";
      
      CallExpr *func= myNodeCreater.CreateCall();
      CallExpr *anotherFunc = myNodeCreater.CreateAnotherCall(); // identical function to CreateCall, with only function name change
      std::vector<Stmt *> NewStmts;
 NewStmts.push_back(func);
      StmtNode NewBody = Visit(D->getBody());
      for (auto SubToBody : NewBody) {
 NewStmts.push_back(SubToBody);
      }
 NewStmts.push_back(anotherFunc );

      CompoundStmt *CS = CompoundStmt::Create(getContext(), NewStmts, FPOptionsOverride(), SourceLocation(), SourceLocation());
      NewFD->setBody(CS);
 Ctx.getTranslationUnitDecl()->addDecl(NewFD);
      return NewFD;
 }
```
(runPass function)
```
void SourceTransformAction::runPass(ASTTransformer *Pass) {
 std::unique_ptr<CompilerInstance> Clang(new CompilerInstance());
 Clang->createDiagnostics();
  CompilerInstance &CI = *Clang.get();
 auto Invocation = std::make_shared<CompilerInvocation>(getCompilerInstance().getInvocation());
 CI.setInvocation(std::move(Invocation));
  CI.createTarget();
 CI.LoadRequestedPlugins();
  CI.createFileManager();
 CI.createSourceManager(CI.getFileManager());
 CI.createPreprocessor(getTranslationUnitKind());
 CI.createASTContext();
  ASTContext &NewContext = CI.getASTContext();
 NewContext.addTranslationUnitDecl();
  Pass->setContext(NewContext);
 auto &SrcManager = CI.getSourceManager();
  std::cout << "Old TU: ---------------------------------\n";
 getContext().getTranslationUnitDecl()->dump();
  for (Decl *D : getContext().getTranslationUnitDecl()->decls()) {
    SourceLocation Loc = D->getLocation();
    Loc = SrcManager.getExpansionLoc(Loc);
    // If this is for a builtin, ignore it.
    if (Loc.isInvalid())
 continue;
    Pass->Visit(D);
  }
  setContext(NewContext);
 std::cout << "New TU: ---------------------------------\n";
 getContext().getTranslationUnitDecl()->dump();
}
```
(Transform())
```
 virtual void Transform() override {
    runPass(new MyTransformer());
 std::cout << "after runpass --------------\n";
 getContext().getTranslationUnitDecl()->dump();
  };
```
The printing shows that, the transformation is OK after "NEW TU" printing, but changed after "after runpass" printing. Really need some help on this. Thanks a lot in advance!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW1tz4jgW_jXOiyqULQM2D3mgTajNTHc6G5jeR0q2jkHbRmIkOQnz67ck29gyhnRvbc1lp1MZButyLt-56chpohTbcoA7b_LBmyxuSKl3Qt6tSKGPTzuh2U0q6PEukUTtkJYkAy-cI89feP7cm_r1r31caZJ9RbTcH7xwXg35I8-fPUmxlWSPiNyWe-BaGQojDy-zgvAtupXwKpmG20NeiFd0m4sD8P0BeXi5E3vw8LJgmhF-ZHzr4aUGpUcZuhXIfLuVr6Os4oU8HPrIf_N9359MphHJ8imMx2P0JBnXVri1kX_FtpwU_yCcFiA9HL8IRj089_AMVVNqlB2MCr7970Q76NHO8DRDRfGyN9qGc3VU1ZekAMLLw2deUfNwXHKLMUWFMCrMkIfjk_4e_uC_hfE4xdPMw7OWH3b4AZnlNEbWDs-QiReQx74mjGtD3VmTCK7hTQ-rFNYsopzSKaTZdIx9tNlIUFpI2EhtJLUGSD28fIunm-n4tmC8fLvd8rKaOOidBEJHSox8q0swHmPf0WTc0ST18RRCOkOV8haxld7r6tsW9D2nH0Vm-c5QJrjS53BN0zEN6cxhMukzSaf0IpOVKGUGz4Rv4X1O6ZQ6nKYuJxrmNOxyWsObfhQUFuX-ALIa-8IU0x6OewJVbGvvG2Ce4pyGDvOo6xV57sdRirvM56u14b2W5AWkMuwTd7aWCifXRL7_VqmTTgSstGR8-wy5EdiOeDgqyD6lxMNRhXM1Lg4giRayHrtugQiiKMUOCHEPhFmQTZDStKK-WZY800zwza4OjTAxQW5op0IUlmWC7FAPg7UEWGlZZrqUUENGabJjBT0D8s8N872H48E9yV_JWy5MNVZsOG8-bRh_EV9NMLduMOfHDSWaNAJMjQDV1qn9HQq5COIgmzjeNjvzthx-eNsPb_sfeVsOJ28zpwy_n-BJFv_wnr-AGhcMHJEsdgwc9A0c0-CvpOd_VcFjGjgg4B8V_O8SFX9wBTfeFva8DYJ0-v_lbQvIim4z8Wd3q2-W94_wHxqkU8d_xq7_4ACyKeppU32ztx9dgCV53QilJZC9w7-PtoHsc6kPpV4KuSf6Wj6NfR8yV8Ju90sgzyc-pE73axvetSRc5ULu59bfq6n7N8hKDfVQlcnPeE5iOvYhdXh2-2BCySxKA6eQLaXgGjgdYHaJzTiMpmnglorIZRNABk67nYj9gRUgH7jShGcwrNVluS74wRjnNIPQEcXpO2kakTxyUK6ZthK9iIycC3Am8YX-fzyezPLIBd1pRkicRVE6RlkWbPaEccfz5lKSo4nsMMl2RLbRZlJAgtyxOr9dkiQIyDRKx11JsN-TxKeTFDUIJMHaunk31exJUXyBTAv5sD8Ug2JZU1DJXkCe31gZps7hicZxPJnMqszcMsqbdC6t8k0q76aLjBRFSrKvm5y7ma3iXZspCRKx3xNO-747CHI7-Plg2JPCGWwzrRHCmqBNVJvs7S0IqoeUKJZtlF1eg-QsNgMbLQnTqpnukSNFYfxOyM68WTJv08_8lF_eqRT1jeVPIh02SP-Wkvg06thi6C6ymnku-YrkUBwdPK_bbvDqNIpnPo0c1wz7XpKOM_S3trLF7UCkHvlXzTl2kZvgWQgXkbNpjJwl9wZOJ-f1NpoFTlX-tqVzp4ZerJDjIAxmodNX40lPszCc0O_V7CeRqstq_STSj0xpR61r6e9kyQNhxoj2-v7bkajN_Y144HBCHTymPTwgIBdjZNH57tS4geJ2CcffEY-hUhqENCCZg0DUK2CTSVi_lmiKaSOBDc75leI4noQzh3bsvFmZjsd-HKLNpmCpCXoitWWBPLxMS9Ms4OXWzN2ufnv4LfpwesSjMDC8VOnh5Wh0-monLZ1R5oXzcIzNZ8u-f0rwZ1NAFeMh-Wf5bNqJFve13jMU5IVw49fUHq5qLnEigWhACSmK-7eDvLS_mUcenn86mvag2tjY0T6YRc2hMPpQ370i1Ga7KlMi06o9kj0gL1wgD2Pz7GHshZ09_yxJsT4eAK3tqi3opvBYBqMt6KbjM8s8HJ8t-aV-Y_fA9fpoXMCLPpwt-iIYXR-9aFEvsN9mjiimMSDSBoCV-tFIVE_35izR6ZAwD9S-NK0k93D8pIUo1MoYs4Gj6ZQa1o1-ts3y8Hy5MEh0R7vgGz4nkc1PXwSj4BCMtp-o4vsXzrSle9pQtRwf2xNwNV5zujCLHs3H2nzwsigO2lbFVbK5f9MgeR9fDy89vESEUgR2ATIHiAaExa0X3iuwcrWyf6ciLsPGkQ0b6_ThwhryGfLq0UF1CMdHUBqoMdrqABnLGcjT-84rsKHlogXvO35yUii4TtegZDCoYqEe_vLz5uMXUpTQR6AbzlkT-uGiTQPf61gnKA04gsOgs9Wx5gp2Ramn6nSmPr-AlIzCgDUl6FJy1OpQT5gwHspjHo7tRQZqzqiXEl4T-CbVIbvFCTwc96PTpA0kaknd_IfOQvkRXpcLm9iaAAmd9YMpBzVGNkMPPBet659yTweaXgYd8BCX53y1rs2FPDxN9Ntg4m03tTpcSUmJfjOmTPTbu6nmnZzyvbmm8sK-klbowYzyvogdWk-mMVZzpU-VUEhEnMfBzNGS6ApVJ8C2bRClRl6YeGFiyuMj4sYHtqDnalX3GnMz0ax5HHXn6gJ82o5uz368ScL7BReh7vdugrDZOFygfbfuj_olv0esS4BwoXcgjZugS4Tm1RqHXgMMM7WTZaQ4RS3SAnUFSNAr0zskeHFs11jUsp39-5COZCeYX-y51QsTez1enT6Ng5hH5fi5HRkdSrXbpCT76uHYYnKmtFlnE8YjvH4Q9Gi1bS5OmwA0E8N1CaFcGMBiUmqBVmW6FjWVeUPRPVsNinbad07-lBWHdzp2uuCrphsQJacNZsnKKtkd_qb6WaN8Lc1fjvnh8WuxXoOerJxl78W82UworQcsvXM2dQmqZk9TVwqQLPkTUerdEmTvTa7c-dZ0PBzPV-vTCrAhV010feXk9iVnv5awsUUnOb93vUdJ1VTEHF7R-S3nGdZ2uUEqsxZfMLLlQmmWqbPE0KdmC81D3QbMLaH6eOzss-HQ3sPa9Sd19uQrbNSOSKCOPqdbW3sFZp1wSBXDz7niPVPvYaR6S1re4sWQ6U72_DB5GFWwrIkc0Cx5GH0UhD7Dr6U9UT4V5ZbxAeAaMktWwCfCyRbkAK1qTeUy7arkwXZLZzsHNz9JOEiRgVJNCetFx8_M3gpdJNAeI860cE8Yj_B6ejIZxEp5eXe7fEQovVymW3YmBurwb2m2ZM5dzMPTlcxqkDpC9QF12Vwq258Lita_mNx9XoDfq8ff1d4YHetXVq5kdTU5nVBtIfl-0pAVqvPnEd2TrZuI0UeROWfNXobu5s1maQu4EeT-7UC4YoJX3ZT9HGwWH3Kkd0whpqyWBKUlKzTjpjqwLRcSENOjdhvLUUVvxNQDfyEF6zhxtSoTXDNegsOu8aFTEXflaQsq-hYvu3jCg9c_1FWuFKtTXenB1W-XXpjUJSmq1zi9TRfaorZ-mUrz6dgpYQMJ5hJ2JNcgDa2Dqam_S1wZuE7QuTisd4AOkhlP2iK1E68K6R2xF5B6B0g3KlbxwhT6_DOqNDBucP8v4wYYn0jYa-FS16dY2i51tO7uGKFnIEVxRByAIiX2gHZQHJA5M--YGqH1jvCvChFUCI0YR4S-VNUwuKF3IZ2FM3IDd8F0NpvE8RiPb3Z3URoEeAY0n-Qky3PAoQ9ZSoDkaZxHM7hhd9jHYRAEvh9OwnE4onEaYYhiyOJoQoB6Yx_2hBWjonjZj4Tc3jClSriLgnjm3xQkhULZf7yAsfEFO2kMN1ncyDuz5zYtt8ob-wVTWrVUNNMF3FVHTdr2HDuiENOqe6mDJBwKkgFFpTK2sQEtJDoQrUHym1IWdzutD_bv_22O2TK9K9NRJvYeXtor7-p_twcp_g2Z9vDSyqk8vLR6_CcAAP__YWud4w">