Skip to content

Commit 15bf047

Browse files
authored
Merge pull request #34195 from slavapestov/dynamic-self-var-csapply
Sema: Fix type of MemberRefExpr for a VarDecl with DynamicSelfType
2 parents 6918525 + d01e1dd commit 15bf047

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

lib/Sema/CSApply.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ namespace {
12581258
}
12591259

12601260
// For properties, build member references.
1261-
if (isa<VarDecl>(member)) {
1261+
if (auto *varDecl = dyn_cast<VarDecl>(member)) {
12621262
if (isUnboundInstanceMember) {
12631263
assert(memberLocator.getBaseLocator() &&
12641264
cs.UnevaluatedRootExprs.count(
@@ -1271,17 +1271,22 @@ namespace {
12711271
base->setImplicit();
12721272
}
12731273

1274+
auto hasDynamicSelf =
1275+
varDecl->getValueInterfaceType()->hasDynamicSelfType();
1276+
12741277
auto memberRefExpr
12751278
= new (context) MemberRefExpr(base, dotLoc, memberRef,
12761279
memberLoc, Implicit, semantics);
12771280
memberRefExpr->setIsSuper(isSuper);
1281+
1282+
if (hasDynamicSelf)
1283+
refTy = refTy->replaceCovariantResultType(containerTy, 1);
12781284
cs.setType(memberRefExpr, refTy->castTo<FunctionType>()->getResult());
12791285

12801286
Expr *result = memberRefExpr;
12811287
closeExistential(result, locator);
12821288

1283-
if (cast<VarDecl>(member)->getValueInterfaceType()
1284-
->hasDynamicSelfType()) {
1289+
if (hasDynamicSelf) {
12851290
if (!baseTy->isEqual(containerTy)) {
12861291
result = new (context) CovariantReturnConversionExpr(
12871292
result, simplifyType(openedType));

test/type/self.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,18 @@ struct OuterType {
299299
return optional.map { `Self`(string: $0) }
300300
}
301301
}
302+
303+
// rdar://69804933 - CSApply assigns wrong type to MemberRefExpr for property with
304+
// DynamicSelfType
305+
class HasDynamicSelfProperty {
306+
var me: Self {
307+
return self
308+
}
309+
}
310+
311+
// SILGen doesn't care about the MemberRefExpr's type, so it's hard to come up with an
312+
// example that actually fails. Here, the rogue 'Self' type was diagnosed as being invalid
313+
// in a stored property initializer.
314+
class UsesDynamicSelfProperty {
315+
var c = HasDynamicSelfProperty().me
316+
}

0 commit comments

Comments
 (0)