@@ -1040,8 +1040,6 @@ namespace {
1040
1040
ASTContext &Ctx;
1041
1041
DeclContext *DC;
1042
1042
1043
- Expr *ParentExpr;
1044
-
1045
1043
// / A stack of expressions being walked, used to determine where to
1046
1044
// / insert RebindSelfInConstructorExpr nodes.
1047
1045
llvm::SmallVector<Expr *, 8 > ExprStack;
@@ -1106,8 +1104,7 @@ namespace {
1106
1104
void markAcceptableDiscardExprs (Expr *E);
1107
1105
1108
1106
public:
1109
- PreCheckExpression (DeclContext *dc, Expr *parent)
1110
- : Ctx(dc->getASTContext ()), DC(dc), ParentExpr(parent) {}
1107
+ PreCheckExpression (DeclContext *dc) : Ctx(dc->getASTContext ()), DC(dc) {}
1111
1108
1112
1109
ASTContext &getASTContext () const { return Ctx; }
1113
1110
@@ -1237,25 +1234,29 @@ namespace {
1237
1234
if (expr->isImplicit ())
1238
1235
return finish (true , expr);
1239
1236
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 ;
1245
1241
1242
+ auto parent = parents.back ();
1243
+ parents = parents.drop_back ();
1244
+ return parent;
1245
+ };
1246
+ if (auto *parent = takeNextParent ()) {
1246
1247
if (isa<SequenceExpr>(parent))
1247
1248
return finish (true , expr);
1248
1249
1249
1250
SourceLoc lastInnerParenLoc;
1250
1251
// Unwrap to the outermost paren in the sequence.
1251
1252
// e.g. `foo(((&bar))`
1252
1253
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)
1255
1256
break ;
1256
1257
1257
1258
lastInnerParenLoc = PE->getLParenLoc ();
1258
- parent = nextParent-> second ;
1259
+ parent = nextParent;
1259
1260
}
1260
1261
1261
1262
if (isa<ApplyExpr>(parent) || isa<UnresolvedMemberExpr>(parent)) {
@@ -2476,7 +2477,7 @@ bool ConstraintSystem::preCheckExpression(Expr *&expr, DeclContext *dc) {
2476
2477
auto &ctx = dc->getASTContext ();
2477
2478
FrontendStatsTracer StatsTracer (ctx.Stats , " precheck-expr" , expr);
2478
2479
2479
- PreCheckExpression preCheck (dc, expr );
2480
+ PreCheckExpression preCheck (dc);
2480
2481
2481
2482
// Perform the pre-check.
2482
2483
if (auto result = expr->walk (preCheck)) {
0 commit comments