@@ -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));
0 commit comments