Skip to content

Commit 3c7a17e

Browse files
committed
Fixed a bug in AssignExpr that caused it to create invalid source ranges
1 parent 5999021 commit 3c7a17e

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

include/swift/AST/Expr.h

+4-2
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

+38-3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ TEST(SourceLoc, AssignExpr) {
5050
C.Ctx.getIdentifier("bb"),
5151
DeclNameLoc(start.getAdvancedLoc(3)),
5252
/*implicit*/false);
53+
auto destImplicit = new (C.Ctx) UnresolvedDotExpr(
54+
destBase,
55+
start.getAdvancedLoc(2),
56+
C.Ctx.getIdentifier("bb"),
57+
DeclNameLoc(start.getAdvancedLoc(3)),
58+
/*implicit*/true);
5359

5460
auto sourceBase = new (C.Ctx) UnresolvedDeclRefExpr(
5561
C.Ctx.getIdentifier("cc"),
@@ -61,6 +67,13 @@ TEST(SourceLoc, AssignExpr) {
6167
C.Ctx.getIdentifier("dd"),
6268
DeclNameLoc(start.getAdvancedLoc(11)),
6369
/*implicit*/false);
70+
auto sourceImplicit = new (C.Ctx) UnresolvedDotExpr(
71+
sourceBase,
72+
start.getAdvancedLoc(10),
73+
C.Ctx.getIdentifier("dd"),
74+
DeclNameLoc(start.getAdvancedLoc(11)),
75+
/*implicit*/true);
76+
6477

6578
auto invalid = new (C.Ctx) UnresolvedDeclRefExpr(
6679
C.Ctx.getIdentifier("invalid"),
@@ -76,8 +89,30 @@ TEST(SourceLoc, AssignExpr) {
7689
EXPECT_EQ(SourceRange(start, start.getAdvancedLoc(11)),
7790
complete->getSourceRange());
7891

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

88123
auto invalidDest = new (C.Ctx) AssignExpr(invalid, SourceLoc(), source,
89-
/*implicit*/true);
124+
/*implicit*/false);
90125
EXPECT_EQ(start.getAdvancedLoc(8), invalidDest->getStartLoc());
91126
EXPECT_EQ(SourceLoc(), invalidDest->getEqualLoc());
92127
EXPECT_EQ(SourceLoc(), invalidDest->getLoc());
@@ -95,7 +130,7 @@ TEST(SourceLoc, AssignExpr) {
95130
invalidDest->getSourceRange());
96131

97132
auto invalidAll = new (C.Ctx) AssignExpr(invalid, SourceLoc(), invalid,
98-
/*implicit*/true);
133+
/*implicit*/false);
99134
EXPECT_EQ(SourceLoc(), invalidAll->getStartLoc());
100135
EXPECT_EQ(SourceLoc(), invalidAll->getEqualLoc());
101136
EXPECT_EQ(SourceLoc(), invalidAll->getLoc());

0 commit comments

Comments
 (0)