Skip to content

Commit 8c7e75a

Browse files
committed
[AST] Eliminate OverloadedMemberRefExpr.
This expression kind was introduced in exactly one place, and only with one member. That place can use MemberRefExpr instead.
1 parent 3dd898f commit 8c7e75a

File tree

8 files changed

+7
-138
lines changed

8 files changed

+7
-138
lines changed

include/swift/AST/Expr.h

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,6 @@ class alignas(8) Expr {
246246
enum { NumOverloadSetRefExprBits = NumExprBits };
247247
static_assert(NumOverloadSetRefExprBits <= 32, "fits in an unsigned");
248248

249-
class OverloadedMemberRefExprBitfields {
250-
friend class OverloadedMemberRefExpr;
251-
unsigned : NumOverloadSetRefExprBits;
252-
unsigned Semantics : 2; // an AccessSemantics
253-
};
254-
enum { NumOverloadedMemberRefExprBits = NumOverloadSetRefExprBits + 2 };
255-
static_assert(NumOverloadedMemberRefExprBits <= 32, "fits in an unsigned");
256-
257249
class BooleanLiteralExprBitfields {
258250
friend class BooleanLiteralExpr;
259251
unsigned : NumLiteralExprBits;
@@ -412,7 +404,6 @@ class alignas(8) Expr {
412404
DynamicSubscriptExprBitfields DynamicSubscriptExprBits;
413405
UnresolvedMemberExprBitfields UnresolvedMemberExprBits;
414406
OverloadSetRefExprBitfields OverloadSetRefExprBits;
415-
OverloadedMemberRefExprBitfields OverloadedMemberRefExprBits;
416407
BooleanLiteralExprBitfields BooleanLiteralExprBits;
417408
MagicIdentifierLiteralExprBitfields MagicIdentifierLiteralExprBits;
418409
ObjectLiteralExprBitfields ObjectLiteralExprBits;
@@ -1422,45 +1413,6 @@ class OverloadedDeclRefExpr : public OverloadSetRefExpr {
14221413
}
14231414
};
14241415

1425-
/// OverloadedMemberRefExpr - A reference to an overloaded name that is a
1426-
/// member, relative to some base expression, that will eventually be
1427-
/// resolved to some kind of member-reference expression.
1428-
class OverloadedMemberRefExpr : public OverloadSetRefExpr {
1429-
Expr *SubExpr;
1430-
SourceLoc DotLoc;
1431-
DeclNameLoc MemberLoc;
1432-
1433-
public:
1434-
OverloadedMemberRefExpr(Expr *SubExpr, SourceLoc DotLoc,
1435-
ArrayRef<ValueDecl *> Decls, DeclNameLoc MemberLoc,
1436-
bool Implicit, Type Ty = Type(),
1437-
AccessSemantics semantics = AccessSemantics::Ordinary)
1438-
: OverloadSetRefExpr(ExprKind::OverloadedMemberRef, Decls, Implicit, Ty),
1439-
SubExpr(SubExpr), DotLoc(DotLoc), MemberLoc(MemberLoc) {
1440-
OverloadedMemberRefExprBits.Semantics = unsigned(semantics);
1441-
}
1442-
1443-
SourceLoc getDotLoc() const { return DotLoc; }
1444-
DeclNameLoc getMemberLoc() const { return MemberLoc; }
1445-
Expr *getBase() const { return SubExpr; }
1446-
void setBase(Expr *E) { SubExpr = E; }
1447-
1448-
SourceLoc getLoc() const { return MemberLoc.getBaseNameLoc(); }
1449-
SourceLoc getStartLoc() const {
1450-
return DotLoc.isValid()? SubExpr->getStartLoc()
1451-
: MemberLoc.getBaseNameLoc();
1452-
}
1453-
SourceLoc getEndLoc() const { return MemberLoc.getSourceRange().End; }
1454-
1455-
AccessSemantics getAccessSemantics() const {
1456-
return AccessSemantics(OverloadedMemberRefExprBits.Semantics);
1457-
}
1458-
1459-
static bool classof(const Expr *E) {
1460-
return E->getKind() == ExprKind::OverloadedMemberRef;
1461-
}
1462-
};
1463-
14641416
/// UnresolvedDeclRefExpr - This represents use of an undeclared identifier,
14651417
/// which may ultimately be a use of something that hasn't been defined yet, it
14661418
/// may be a use of something that got imported (which will be resolved during

include/swift/AST/ExprNodes.def

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ EXPR(OtherConstructorDeclRef, Expr)
6767
EXPR(DotSyntaxBaseIgnored, Expr)
6868
ABSTRACT_EXPR(OverloadSetRef, Expr)
6969
UNCHECKED_EXPR(OverloadedDeclRef, OverloadSetRefExpr)
70-
UNCHECKED_EXPR(OverloadedMemberRef, OverloadSetRefExpr)
71-
EXPR_RANGE(OverloadSetRef, OverloadedDeclRef, OverloadedMemberRef)
70+
EXPR_RANGE(OverloadSetRef, OverloadedDeclRef, OverloadedDeclRef)
7271
UNCHECKED_EXPR(UnresolvedDeclRef, Expr)
7372
EXPR(MemberRef, Expr)
7473
ABSTRACT_EXPR(DynamicLookup, Expr)

lib/AST/ASTDumper.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,18 +1730,6 @@ class PrintExpr : public ExprVisitor<PrintExpr> {
17301730
}
17311731
OS << ')';
17321732
}
1733-
void visitOverloadedMemberRefExpr(OverloadedMemberRefExpr *E) {
1734-
printCommon(E, "overloaded_member_ref_expr")
1735-
<< " name=" << E->getDecls()[0]->getName()
1736-
<< " #decls=" << E->getDecls().size() << "\n";
1737-
printRec(E->getBase());
1738-
for (ValueDecl *D : E->getDecls()) {
1739-
OS << '\n';
1740-
OS.indent(Indent);
1741-
D->dumpRef(OS);
1742-
}
1743-
OS << ')';
1744-
}
17451733
void visitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
17461734
printCommon(E, "unresolved_decl_ref_expr")
17471735
<< " name=" << E->getName()

lib/AST/ASTWalker.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,6 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
359359
}
360360

361361
Expr *visitOverloadedDeclRefExpr(OverloadedDeclRefExpr *E) { return E; }
362-
Expr *visitOverloadedMemberRefExpr(OverloadedMemberRefExpr *E) {
363-
if (auto base = doIt(E->getBase())) {
364-
E->setBase(base);
365-
return E;
366-
}
367-
368-
return nullptr;
369-
}
370362
Expr *visitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) { return E; }
371363

372364
Expr *visitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {

lib/AST/Expr.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,6 @@ ConcreteDeclRef Expr::getReferencedDecl() const {
387387

388388
// FIXME: Return multiple results?
389389
case ExprKind::OverloadedDeclRef:
390-
case ExprKind::OverloadedMemberRef:
391390
return ConcreteDeclRef();
392391

393392
NO_REFERENCE(UnresolvedDeclRef);
@@ -674,9 +673,6 @@ bool Expr::canAppendCallParentheses() const {
674673
return !overloadedExpr->getDecls().front()->getName().isOperator();
675674
}
676675

677-
case ExprKind::OverloadedMemberRef:
678-
return true;
679-
680676
case ExprKind::UnresolvedDeclRef:
681677
return cast<UnresolvedDeclRefExpr>(this)->getName().isOperator();
682678

@@ -1306,9 +1302,6 @@ MemberRefExpr::MemberRefExpr(Expr *base, SourceLoc dotLoc,
13061302
Type OverloadSetRefExpr::getBaseType() const {
13071303
if (isa<OverloadedDeclRefExpr>(this))
13081304
return Type();
1309-
if (auto *DRE = dyn_cast<OverloadedMemberRefExpr>(this)) {
1310-
return DRE->getBase()->getType()->getRValueType();
1311-
}
13121305

13131306
llvm_unreachable("Unhandled overloaded set reference expression");
13141307
}

lib/Sema/CSApply.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2275,23 +2275,6 @@ namespace {
22752275
AccessSemantics::Ordinary);
22762276
}
22772277

2278-
Expr *visitOverloadedMemberRefExpr(OverloadedMemberRefExpr *expr) {
2279-
auto memberLocator = cs.getConstraintLocator(expr,
2280-
ConstraintLocator::Member);
2281-
auto selected = getOverloadChoice(memberLocator);
2282-
bool isDynamic = selected.choice.getKind()
2283-
== OverloadChoiceKind::DeclViaDynamic;
2284-
return buildMemberRef(expr->getBase(),
2285-
selected.openedFullType,
2286-
expr->getDotLoc(),
2287-
selected.choice.getDecl(), expr->getMemberLoc(),
2288-
selected.openedType,
2289-
cs.getConstraintLocator(expr),
2290-
memberLocator,
2291-
expr->isImplicit(), expr->getAccessSemantics(),
2292-
isDynamic);
2293-
}
2294-
22952278
Expr *visitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *expr) {
22962279
// FIXME: We should have generated an overload set from this, in which
22972280
// case we can emit a typo-correction error here but recover well.
@@ -3856,7 +3839,6 @@ resolveLocatorToDecl(ConstraintSystem &cs, ConstraintLocator *locator,
38563839
return ctorRef->getDeclRef();
38573840

38583841
if (isa<OverloadedDeclRefExpr>(anchor) ||
3859-
isa<OverloadedMemberRefExpr>(anchor) ||
38603842
isa<UnresolvedDeclRefExpr>(anchor)) {
38613843
// Overloaded and unresolved cases: find the resolved overload.
38623844
auto anchorLocator = cs.getConstraintLocator(anchor);

lib/Sema/CSDiag.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,8 +3136,7 @@ typeCheckChildIndependently(Expr *subExpr, Type convertType,
31363136
// which is the most specialized) even then all the constraints are being
31373137
// fulfilled by UnresolvedType, which doesn't tell us anything.
31383138
if (convertTypePurpose == CTP_Unused &&
3139-
(isa<OverloadedDeclRefExpr>(subExpr->getValueProvidingExpr()) ||
3140-
isa<OverloadedMemberRefExpr>(subExpr->getValueProvidingExpr()))) {
3139+
(isa<OverloadedDeclRefExpr>(subExpr->getValueProvidingExpr()))) {
31413140
return subExpr;
31423141
}
31433142

lib/Sema/CSGen.cpp

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,38 +1391,6 @@ namespace {
13911391
return tv;
13921392
}
13931393

1394-
Type visitOverloadedMemberRefExpr(OverloadedMemberRefExpr *expr) {
1395-
// For a reference to an overloaded declaration, we create a type variable
1396-
// that will be bound to different types depending on which overload
1397-
// is selected.
1398-
auto tv = CS.createTypeVariable(CS.getConstraintLocator(expr),
1399-
TVO_CanBindToLValue);
1400-
ArrayRef<ValueDecl*> decls = expr->getDecls();
1401-
SmallVector<OverloadChoice, 4> choices;
1402-
auto baseTy = expr->getBase()->getType();
1403-
for (unsigned i = 0, n = decls.size(); i != n; ++i) {
1404-
// If the result is invalid, skip it.
1405-
// FIXME: Note this as invalid, in case we don't find a solution,
1406-
// so we don't let errors cascade further.
1407-
CS.getTypeChecker().validateDecl(decls[i], true);
1408-
if (decls[i]->isInvalid())
1409-
continue;
1410-
1411-
choices.push_back(OverloadChoice(baseTy, decls[i],
1412-
/*isSpecialized=*/false,
1413-
CS));
1414-
}
1415-
1416-
// If there are no valid overloads, give up.
1417-
if (choices.empty())
1418-
return nullptr;
1419-
1420-
// Record this overload set.
1421-
auto locator = CS.getConstraintLocator(expr, ConstraintLocator::Member);
1422-
CS.addOverloadSet(tv, choices, locator);
1423-
return tv;
1424-
}
1425-
14261394
Type visitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *expr) {
14271395
// This is an error case, where we're trying to use type inference
14281396
// to help us determine which declaration the user meant to refer to.
@@ -2755,11 +2723,9 @@ namespace {
27552723
DeclNameLoc memberLoc;
27562724
if (auto member = findReferencedDecl(dotCall->getFn(), memberLoc)) {
27572725
auto base = skipImplicitConversions(dotCall->getArg());
2758-
auto members
2759-
= TC.Context.AllocateCopy(ArrayRef<ValueDecl *>(&member, 1));
2760-
return new (TC.Context) OverloadedMemberRefExpr(base,
2761-
dotCall->getDotLoc(), members, memberLoc,
2762-
expr->isImplicit());
2726+
return new (TC.Context) MemberRefExpr(base,
2727+
dotCall->getDotLoc(), member, memberLoc,
2728+
expr->isImplicit());
27632729
}
27642730
}
27652731

@@ -2771,10 +2737,8 @@ namespace {
27712737
DeclNameLoc memberLoc;
27722738
if (auto member = findReferencedDecl(dotIgnored->getRHS(), memberLoc)) {
27732739
auto base = skipImplicitConversions(dotIgnored->getLHS());
2774-
auto members
2775-
= TC.Context.AllocateCopy(ArrayRef<ValueDecl *>(&member, 1));
2776-
return new (TC.Context) OverloadedMemberRefExpr(base,
2777-
dotIgnored->getDotLoc(), members,
2740+
return new (TC.Context) MemberRefExpr(base,
2741+
dotIgnored->getDotLoc(), member,
27782742
memberLoc, expr->isImplicit());
27792743
}
27802744
}

0 commit comments

Comments
 (0)