@@ -1040,8 +1040,6 @@ namespace {
10401040 ASTContext &Ctx;
10411041 DeclContext *DC;
10421042
1043- Expr *ParentExpr;
1044-
10451043 // / A stack of expressions being walked, used to determine where to
10461044 // / insert RebindSelfInConstructorExpr nodes.
10471045 llvm::SmallVector<Expr *, 8 > ExprStack;
@@ -1106,8 +1104,7 @@ namespace {
11061104 void markAcceptableDiscardExprs (Expr *E);
11071105
11081106 public:
1109- PreCheckExpression (DeclContext *dc, Expr *parent)
1110- : Ctx(dc->getASTContext ()), DC(dc), ParentExpr(parent) {}
1107+ PreCheckExpression (DeclContext *dc) : Ctx(dc->getASTContext ()), DC(dc) {}
11111108
11121109 ASTContext &getASTContext () const { return Ctx; }
11131110
@@ -1237,25 +1234,29 @@ namespace {
12371234 if (expr->isImplicit ())
12381235 return finish (true , expr);
12391236
1240- auto parents = ParentExpr->getParentMap ();
1241-
1242- auto result = parents.find (expr);
1243- if (result != parents.end ()) {
1244- auto *parent = result->getSecond ();
1237+ ArrayRef<Expr *> parents = ExprStack;
1238+ auto takeNextParent = [&]() -> Expr * {
1239+ if (parents.empty ())
1240+ return nullptr ;
12451241
1242+ auto parent = parents.back ();
1243+ parents = parents.drop_back ();
1244+ return parent;
1245+ };
1246+ if (auto *parent = takeNextParent ()) {
12461247 if (isa<SequenceExpr>(parent))
12471248 return finish (true , expr);
12481249
12491250 SourceLoc lastInnerParenLoc;
12501251 // Unwrap to the outermost paren in the sequence.
12511252 // e.g. `foo(((&bar))`
12521253 while (auto *PE = dyn_cast<ParenExpr>(parent)) {
1253- auto nextParent = parents. find (parent );
1254- if (nextParent == parents. end () )
1254+ auto nextParent = takeNextParent ( );
1255+ if (! nextParent)
12551256 break ;
12561257
12571258 lastInnerParenLoc = PE->getLParenLoc ();
1258- parent = nextParent-> second ;
1259+ parent = nextParent;
12591260 }
12601261
12611262 if (isa<ApplyExpr>(parent) || isa<UnresolvedMemberExpr>(parent)) {
@@ -2476,7 +2477,7 @@ bool ConstraintSystem::preCheckExpression(Expr *&expr, DeclContext *dc) {
24762477 auto &ctx = dc->getASTContext ();
24772478 FrontendStatsTracer StatsTracer (ctx.Stats , " precheck-expr" , expr);
24782479
2479- PreCheckExpression preCheck (dc, expr );
2480+ PreCheckExpression preCheck (dc);
24802481
24812482 // Perform the pre-check.
24822483 if (auto result = expr->walk (preCheck)) {
0 commit comments