@@ -3366,6 +3366,20 @@ namespace {
3366
3366
assert (!isa<ImplicitConversionExpr>(expr) &&
3367
3367
" ImplicitConversionExpr should be eliminated in walkToExprPre" );
3368
3368
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
+
3369
3383
// A DotSyntaxCallExpr is a member reference that has already been
3370
3384
// type-checked down to a call; turn it back into an overloaded
3371
3385
// member reference expression.
@@ -3375,21 +3389,23 @@ namespace {
3375
3389
memberLoc);
3376
3390
if (memberAndFunctionRef.first ) {
3377
3391
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 ());
3382
3397
}
3383
3398
}
3384
3399
3385
3400
if (auto *dynamicMember = dyn_cast<DynamicMemberRefExpr>(expr)) {
3386
3401
if (auto memberRef = dynamicMember->getMember ()) {
3387
3402
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 ());
3393
3409
}
3394
3410
}
3395
3411
@@ -3403,10 +3419,11 @@ namespace {
3403
3419
memberLoc);
3404
3420
if (memberAndFunctionRef.first ) {
3405
3421
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 ());
3410
3427
}
3411
3428
}
3412
3429
return expr;
0 commit comments