diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-10 19:22:46 +0900 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-10 19:22:46 +0900 |
commit | 8b02a27fc607ebc54c5a811188b3cea5063564e7 (patch) | |
tree | c1ca7d4acca553301204ebb83383aa87cb59311a /clang/lib/AST/ParentMap.cpp | |
parent | 694a772457b2999b7bd68625a16bf0755e95dcdb (diff) | |
parent | 397ac44f623f891d8f05d6673a95984ac0a26671 (diff) | |
download | llvm-users/chapuni/cov/merge/mcdcsort.zip llvm-users/chapuni/cov/merge/mcdcsort.tar.gz llvm-users/chapuni/cov/merge/mcdcsort.tar.bz2 |
Merge branch 'main' into users/chapuni/cov/merge/mcdcsortusers/chapuni/cov/merge/mcdcsort
Diffstat (limited to 'clang/lib/AST/ParentMap.cpp')
-rw-r--r-- | clang/lib/AST/ParentMap.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/clang/lib/AST/ParentMap.cpp b/clang/lib/AST/ParentMap.cpp index fd749b0..e62e71b 100644 --- a/clang/lib/AST/ParentMap.cpp +++ b/clang/lib/AST/ParentMap.cpp @@ -33,17 +33,19 @@ static void BuildParentMap(MapTy& M, Stmt* S, switch (S->getStmtClass()) { case Stmt::PseudoObjectExprClass: { PseudoObjectExpr *POE = cast<PseudoObjectExpr>(S); - - if (OVMode == OV_Opaque && M[POE->getSyntacticForm()]) - break; - - // If we are rebuilding the map, clear out any existing state. - if (M[POE->getSyntacticForm()]) + Expr *SF = POE->getSyntacticForm(); + + auto [Iter, Inserted] = M.try_emplace(SF, S); + if (!Inserted) { + // Nothing more to do in opaque mode if we are updating an existing map. + if (OVMode == OV_Opaque) + break; + // Update the entry in transparent mode, and clear existing state. + Iter->second = S; for (Stmt *SubStmt : S->children()) - M[SubStmt] = nullptr; - - M[POE->getSyntacticForm()] = S; - BuildParentMap(M, POE->getSyntacticForm(), OV_Transparent); + M.erase(SubStmt); + } + BuildParentMap(M, SF, OV_Transparent); for (PseudoObjectExpr::semantics_iterator I = POE->semantics_begin(), E = POE->semantics_end(); @@ -78,10 +80,15 @@ static void BuildParentMap(MapTy& M, Stmt* S, // The right thing to do is to give the OpaqueValueExpr its syntactic // parent, then not reassign that when traversing the semantic expressions. OpaqueValueExpr *OVE = cast<OpaqueValueExpr>(S); - if (OVMode == OV_Transparent || !M[OVE->getSourceExpr()]) { - M[OVE->getSourceExpr()] = S; - BuildParentMap(M, OVE->getSourceExpr(), OV_Transparent); + Expr *SrcExpr = OVE->getSourceExpr(); + auto [Iter, Inserted] = M.try_emplace(SrcExpr, S); + // Force update in transparent mode. + if (!Inserted && OVMode == OV_Transparent) { + Iter->second = S; + Inserted = true; } + if (Inserted) + BuildParentMap(M, SrcExpr, OV_Transparent); break; } case Stmt::CapturedStmtClass: |