Skip to content

Commit 0ce9aef

Browse files
authored
Merge pull request #5324 from mxswd/fix-assignexpr
2 parents 1c8dbc6 + d77d076 commit 0ce9aef

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

include/swift/AST/Expr.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4248,11 +4248,13 @@ class AssignExpr : public Expr {
42484248
SourceLoc getLoc() const { return EqualLoc; }
42494249
SourceLoc getStartLoc() const {
42504250
if (!isFolded()) return EqualLoc;
4251-
return (Dest->isImplicit() ? Src->getStartLoc() : Dest->getStartLoc());
4251+
return ( Dest->getStartLoc().isValid()
4252+
? Dest->getStartLoc()
4253+
: Src->getStartLoc());
42524254
}
42534255
SourceLoc getEndLoc() const {
42544256
if (!isFolded()) return EqualLoc;
4255-
return (Src->isImplicit() ? Dest->getEndLoc() : Src->getEndLoc());
4257+
return (Src->getEndLoc().isValid() ? Src->getEndLoc() : Dest->getEndLoc());
42564258
}
42574259

42584260
/// True if the node has been processed by binary expression folding.

unittests/AST/SourceLocTests.cpp

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ TEST(SourceLoc, AssignExpr) {
4848
C.Ctx.getIdentifier("bb"),
4949
DeclNameLoc(start.getAdvancedLoc(3)),
5050
/*implicit*/false);
51+
auto destImplicit = new (C.Ctx) UnresolvedDotExpr(
52+
destBase,
53+
start.getAdvancedLoc(2),
54+
C.Ctx.getIdentifier("bb"),
55+
DeclNameLoc(start.getAdvancedLoc(3)),
56+
/*implicit*/true);
5157

5258
auto sourceBase = new (C.Ctx) UnresolvedDeclRefExpr(
5359
C.Ctx.getIdentifier("cc"),
@@ -59,6 +65,13 @@ TEST(SourceLoc, AssignExpr) {
5965
C.Ctx.getIdentifier("dd"),
6066
DeclNameLoc(start.getAdvancedLoc(11)),
6167
/*implicit*/false);
68+
auto sourceImplicit = new (C.Ctx) UnresolvedDotExpr(
69+
sourceBase,
70+
start.getAdvancedLoc(10),
71+
C.Ctx.getIdentifier("dd"),
72+
DeclNameLoc(start.getAdvancedLoc(11)),
73+
/*implicit*/true);
74+
6275

6376
auto invalid = new (C.Ctx) UnresolvedDeclRefExpr(
6477
C.Ctx.getIdentifier("invalid"),
@@ -74,8 +87,30 @@ TEST(SourceLoc, AssignExpr) {
7487
EXPECT_EQ(SourceRange(start, start.getAdvancedLoc(11)),
7588
complete->getSourceRange());
7689

90+
// Implicit dest should not change the source range.
91+
auto completeImplDest = new (C.Ctx) AssignExpr( destImplicit
92+
, start.getAdvancedLoc(6)
93+
, source, /*implicit*/false);
94+
EXPECT_EQ(start, completeImplDest->getStartLoc());
95+
EXPECT_EQ(start.getAdvancedLoc(6), completeImplDest->getEqualLoc());
96+
EXPECT_EQ(start.getAdvancedLoc(6), completeImplDest->getLoc());
97+
EXPECT_EQ(start.getAdvancedLoc(11), completeImplDest->getEndLoc());
98+
EXPECT_EQ(SourceRange(start, start.getAdvancedLoc(11)),
99+
completeImplDest->getSourceRange());
100+
101+
// Implicit source should not change the source range.
102+
auto completeImplSrc = new (C.Ctx) AssignExpr( dest, start.getAdvancedLoc(6)
103+
, sourceImplicit
104+
, /*implicit*/false);
105+
EXPECT_EQ(start, completeImplSrc->getStartLoc());
106+
EXPECT_EQ(start.getAdvancedLoc(6), completeImplSrc->getEqualLoc());
107+
EXPECT_EQ(start.getAdvancedLoc(6), completeImplSrc->getLoc());
108+
EXPECT_EQ(start.getAdvancedLoc(11), completeImplSrc->getEndLoc());
109+
EXPECT_EQ(SourceRange(start, start.getAdvancedLoc(11)),
110+
completeImplSrc->getSourceRange());
111+
77112
auto invalidSource = new (C.Ctx) AssignExpr(dest, SourceLoc(), invalid,
78-
/*implicit*/true);
113+
/*implicit*/false);
79114
EXPECT_EQ(start, invalidSource->getStartLoc());
80115
EXPECT_EQ(SourceLoc(), invalidSource->getEqualLoc());
81116
EXPECT_EQ(SourceLoc(), invalidSource->getLoc());
@@ -84,7 +119,7 @@ TEST(SourceLoc, AssignExpr) {
84119
invalidSource->getSourceRange());
85120

86121
auto invalidDest = new (C.Ctx) AssignExpr(invalid, SourceLoc(), source,
87-
/*implicit*/true);
122+
/*implicit*/false);
88123
EXPECT_EQ(start.getAdvancedLoc(8), invalidDest->getStartLoc());
89124
EXPECT_EQ(SourceLoc(), invalidDest->getEqualLoc());
90125
EXPECT_EQ(SourceLoc(), invalidDest->getLoc());
@@ -93,7 +128,7 @@ TEST(SourceLoc, AssignExpr) {
93128
invalidDest->getSourceRange());
94129

95130
auto invalidAll = new (C.Ctx) AssignExpr(invalid, SourceLoc(), invalid,
96-
/*implicit*/true);
131+
/*implicit*/false);
97132
EXPECT_EQ(SourceLoc(), invalidAll->getStartLoc());
98133
EXPECT_EQ(SourceLoc(), invalidAll->getEqualLoc());
99134
EXPECT_EQ(SourceLoc(), invalidAll->getLoc());

0 commit comments

Comments
 (0)