Skip to content

Commit 30d7c9a

Browse files
committed
[Sema] Remove ParentExpr from pre-check walker
We already maintain a stack of parent expressions which is sufficient.
1 parent 816f0b9 commit 30d7c9a

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

lib/Sema/PreCheckExpr.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)