@@ -1258,7 +1258,7 @@ namespace {
1258
1258
}
1259
1259
1260
1260
// For properties, build member references.
1261
- if (isa <VarDecl>(member)) {
1261
+ if (auto *varDecl = dyn_cast <VarDecl>(member)) {
1262
1262
if (isUnboundInstanceMember) {
1263
1263
assert (memberLocator.getBaseLocator () &&
1264
1264
cs.UnevaluatedRootExprs .count (
@@ -1271,17 +1271,22 @@ namespace {
1271
1271
base->setImplicit ();
1272
1272
}
1273
1273
1274
+ auto hasDynamicSelf =
1275
+ varDecl->getValueInterfaceType ()->hasDynamicSelfType ();
1276
+
1274
1277
auto memberRefExpr
1275
1278
= new (context) MemberRefExpr (base, dotLoc, memberRef,
1276
1279
memberLoc, Implicit, semantics);
1277
1280
memberRefExpr->setIsSuper (isSuper);
1281
+
1282
+ if (hasDynamicSelf)
1283
+ refTy = refTy->replaceCovariantResultType (containerTy, 1 );
1278
1284
cs.setType (memberRefExpr, refTy->castTo <FunctionType>()->getResult ());
1279
1285
1280
1286
Expr *result = memberRefExpr;
1281
1287
closeExistential (result, locator);
1282
1288
1283
- if (cast<VarDecl>(member)->getValueInterfaceType ()
1284
- ->hasDynamicSelfType ()) {
1289
+ if (hasDynamicSelf) {
1285
1290
if (!baseTy->isEqual (containerTy)) {
1286
1291
result = new (context) CovariantReturnConversionExpr (
1287
1292
result, simplifyType (openedType));
0 commit comments