@@ -1057,20 +1057,20 @@ namespace {
10571057/// StructFieldAccess is a simple visitor class to grab the first MemberExpr
10581058/// from an Expr. It records any ArraySubscriptExpr we meet along the way.
10591059class StructFieldAccess
1060- : public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> {
1060+ : public ConstStmtVisitor<StructFieldAccess, const Expr *> {
10611061 bool AddrOfSeen = false;
10621062
10631063public:
10641064 const ArraySubscriptExpr *ASE = nullptr;
10651065
1066- const MemberExpr *VisitMemberExpr(const MemberExpr *E) {
1066+ const Expr *VisitMemberExpr(const MemberExpr *E) {
10671067 if (AddrOfSeen && E->getType()->isArrayType())
10681068 // Avoid forms like '&ptr->array'.
10691069 return nullptr;
10701070 return E;
10711071 }
10721072
1073- const MemberExpr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1073+ const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
10741074 if (ASE)
10751075 // We don't support multiple subscripts.
10761076 return nullptr;
@@ -1079,17 +1079,19 @@ class StructFieldAccess
10791079 ASE = E;
10801080 return Visit(E->getBase());
10811081 }
1082- const MemberExpr *VisitCastExpr(const CastExpr *E) {
1082+ const Expr *VisitCastExpr(const CastExpr *E) {
1083+ if (E->getCastKind() == CK_LValueToRValue)
1084+ return E;
10831085 return Visit(E->getSubExpr());
10841086 }
1085- const MemberExpr *VisitParenExpr(const ParenExpr *E) {
1087+ const Expr *VisitParenExpr(const ParenExpr *E) {
10861088 return Visit(E->getSubExpr());
10871089 }
1088- const MemberExpr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
1090+ const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
10891091 AddrOfSeen = true;
10901092 return Visit(E->getSubExpr());
10911093 }
1092- const MemberExpr *VisitUnaryDeref(const clang::UnaryOperator *E) {
1094+ const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) {
10931095 AddrOfSeen = false;
10941096 return Visit(E->getSubExpr());
10951097 }
@@ -1190,7 +1192,7 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE,
11901192 // GCC does for consistency's sake.
11911193
11921194 StructFieldAccess Visitor;
1193- const MemberExpr *ME = Visitor.Visit(E);
1195+ const MemberExpr *ME = dyn_cast_if_present<MemberExpr>( Visitor.Visit(E) );
11941196 if (!ME)
11951197 return nullptr;
11961198
0 commit comments