@@ -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.
10571057class StructFieldAccess
1058- : public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> {
1058+ : public ConstStmtVisitor<StructFieldAccess, const Expr *> {
10591059 bool AddrOfSeen = false;
10601060
10611061public:
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