Skip to content

Commit 56089d8

Browse files
committed
[CSGen] Sanitizer should preserve type of re-introduced member references (if any)
1 parent e84cf89 commit 56089d8

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

lib/Sema/CSGen.cpp

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)