@@ -1057,20 +1057,20 @@ namespace {
1057
1057
/// StructFieldAccess is a simple visitor class to grab the first MemberExpr
1058
1058
/// from an Expr. It records any ArraySubscriptExpr we meet along the way.
1059
1059
class StructFieldAccess
1060
- : public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> {
1060
+ : public ConstStmtVisitor<StructFieldAccess, const Expr *> {
1061
1061
bool AddrOfSeen = false;
1062
1062
1063
1063
public:
1064
1064
const ArraySubscriptExpr *ASE = nullptr;
1065
1065
1066
- const MemberExpr *VisitMemberExpr(const MemberExpr *E) {
1066
+ const Expr *VisitMemberExpr(const MemberExpr *E) {
1067
1067
if (AddrOfSeen && E->getType()->isArrayType())
1068
1068
// Avoid forms like '&ptr->array'.
1069
1069
return nullptr;
1070
1070
return E;
1071
1071
}
1072
1072
1073
- const MemberExpr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1073
+ const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1074
1074
if (ASE)
1075
1075
// We don't support multiple subscripts.
1076
1076
return nullptr;
@@ -1079,17 +1079,19 @@ class StructFieldAccess
1079
1079
ASE = E;
1080
1080
return Visit(E->getBase());
1081
1081
}
1082
- const MemberExpr *VisitCastExpr(const CastExpr *E) {
1082
+ const Expr *VisitCastExpr(const CastExpr *E) {
1083
+ if (E->getCastKind() == CK_LValueToRValue)
1084
+ return E;
1083
1085
return Visit(E->getSubExpr());
1084
1086
}
1085
- const MemberExpr *VisitParenExpr(const ParenExpr *E) {
1087
+ const Expr *VisitParenExpr(const ParenExpr *E) {
1086
1088
return Visit(E->getSubExpr());
1087
1089
}
1088
- const MemberExpr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
1090
+ const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) {
1089
1091
AddrOfSeen = true;
1090
1092
return Visit(E->getSubExpr());
1091
1093
}
1092
- const MemberExpr *VisitUnaryDeref(const clang::UnaryOperator *E) {
1094
+ const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) {
1093
1095
AddrOfSeen = false;
1094
1096
return Visit(E->getSubExpr());
1095
1097
}
@@ -1190,7 +1192,7 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE,
1190
1192
// GCC does for consistency's sake.
1191
1193
1192
1194
StructFieldAccess Visitor;
1193
- const MemberExpr *ME = Visitor.Visit(E);
1195
+ const MemberExpr *ME = dyn_cast_if_present<MemberExpr>( Visitor.Visit(E) );
1194
1196
if (!ME)
1195
1197
return nullptr;
1196
1198
0 commit comments