Skip to content

Commit f5086e8

Browse files
committed
[Clang][counted-by] Bail out of visitor for LValueToRValue cast
An LValueToRValue cast shouldn't be ignored, so bail out of the visitor if we encounter one.
1 parent 788bbd2 commit f5086e8

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,20 +1055,20 @@ namespace {
10551055
/// StructFieldAccess is a simple visitor class to grab the first MemberExpr
10561056
/// from an Expr. It records any ArraySubscriptExpr we meet along the way.
10571057
class StructFieldAccess
1058-
: public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> {
1058+
: public ConstStmtVisitor<StructFieldAccess, const Expr *> {
10591059
bool AddrOfSeen = false;
10601060

10611061
public:
10621062
const ArraySubscriptExpr *ASE = nullptr;
10631063

1064-
const MemberExpr *VisitMemberExpr(const MemberExpr *E) {
1064+
const Expr *VisitMemberExpr(const MemberExpr *E) {
10651065
if (AddrOfSeen && E->getType()->isArrayType())
10661066
// Avoid forms like '&ptr->array'.
10671067
return nullptr;
10681068
return E;
10691069
}
10701070

1071-
const MemberExpr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1071+
const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
10721072
if (ASE)
10731073
// We don't support multiple subscripts.
10741074
return nullptr;
@@ -1077,17 +1077,19 @@ class StructFieldAccess
10771077
ASE = E;
10781078
return Visit(E->getBase());
10791079
}
1080-
const MemberExpr *VisitCastExpr(const CastExpr *E) {
1080+
const Expr *VisitCastExpr(const CastExpr *E) {
1081+
if (E->getCastKind() == CK_LValueToRValue)
1082+
return E;
10811083
return Visit(E->getSubExpr());
10821084
}
1083-
const MemberExpr *VisitParenExpr(const ParenExpr *E) {
1085+
const Expr *VisitParenExpr(const ParenExpr *E) {
10841086
return Visit(E->getSubExpr());
10851087
}
1086-
const MemberExpr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
1088+
const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
10871089
AddrOfSeen = true;
10881090
return Visit(E->getSubExpr());
10891091
}
1090-
const MemberExpr *VisitUnaryDeref(const clang::UnaryOperator *E) {
1092+
const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) {
10911093
AddrOfSeen = false;
10921094
return Visit(E->getSubExpr());
10931095
}
@@ -1188,7 +1190,7 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE,
11881190
// GCC does for consistency's sake.
11891191

11901192
StructFieldAccess Visitor;
1191-
const MemberExpr *ME = Visitor.Visit(E);
1193+
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Visitor.Visit(E));
11921194
if (!ME)
11931195
return nullptr;
11941196

0 commit comments

Comments
 (0)