@@ -3366,6 +3366,20 @@ namespace {
33663366 assert (!isa<ImplicitConversionExpr>(expr) &&
33673367 " ImplicitConversionExpr should be eliminated in walkToExprPre" );
33683368
3369+ auto buildMemberRef = [&](Type memberType, Expr *base, SourceLoc dotLoc,
3370+ ConcreteDeclRef member, DeclNameLoc memberLoc,
3371+ bool implicit) -> Expr * {
3372+ auto *memberRef = new (TC.Context )
3373+ MemberRefExpr (base, dotLoc, member, memberLoc, implicit);
3374+
3375+ if (memberType) {
3376+ memberRef->setType (memberType);
3377+ return CS.cacheType (memberRef);
3378+ }
3379+
3380+ return memberRef;
3381+ };
3382+
33693383 // A DotSyntaxCallExpr is a member reference that has already been
33703384 // type-checked down to a call; turn it back into an overloaded
33713385 // member reference expression.
@@ -3375,21 +3389,23 @@ namespace {
33753389 memberLoc);
33763390 if (memberAndFunctionRef.first ) {
33773391 assert (!isa<ImplicitConversionExpr>(dotCall->getBase ()));
3378- return new (TC.Context ) MemberRefExpr (dotCall->getBase (),
3379- dotCall->getDotLoc (),
3380- memberAndFunctionRef.first ,
3381- memberLoc, expr->isImplicit ());
3392+ return buildMemberRef (dotCall->getType (),
3393+ dotCall->getBase (),
3394+ dotCall->getDotLoc (),
3395+ memberAndFunctionRef.first ,
3396+ memberLoc, expr->isImplicit ());
33823397 }
33833398 }
33843399
33853400 if (auto *dynamicMember = dyn_cast<DynamicMemberRefExpr>(expr)) {
33863401 if (auto memberRef = dynamicMember->getMember ()) {
33873402 assert (!isa<ImplicitConversionExpr>(dynamicMember->getBase ()));
3388- return new (TC.Context ) MemberRefExpr (dynamicMember->getBase (),
3389- dynamicMember->getDotLoc (),
3390- memberRef,
3391- dynamicMember->getNameLoc (),
3392- expr->isImplicit ());
3403+ return buildMemberRef (dynamicMember->getType (),
3404+ dynamicMember->getBase (),
3405+ dynamicMember->getDotLoc (),
3406+ memberRef,
3407+ dynamicMember->getNameLoc (),
3408+ expr->isImplicit ());
33933409 }
33943410 }
33953411
@@ -3403,10 +3419,11 @@ namespace {
34033419 memberLoc);
34043420 if (memberAndFunctionRef.first ) {
34053421 assert (!isa<ImplicitConversionExpr>(dotIgnored->getLHS ()));
3406- return new (TC.Context ) MemberRefExpr (dotIgnored->getLHS (),
3407- dotIgnored->getDotLoc (),
3408- memberAndFunctionRef.first ,
3409- memberLoc, expr->isImplicit ());
3422+ return buildMemberRef (dotIgnored->getType (),
3423+ dotIgnored->getLHS (),
3424+ dotIgnored->getDotLoc (),
3425+ memberAndFunctionRef.first ,
3426+ memberLoc, expr->isImplicit ());
34103427 }
34113428 }
34123429 return expr;
0 commit comments