Skip to content

Commit 2eb44aa

Browse files
authored
[Clang][counted-by] Bail out of visitor for LValueToRValue cast (llvm#125571)
An LValueToRValue cast shouldn't be ignored, so bail out of the visitor if we encounter one.
1 parent 53d6e59 commit 2eb44aa

File tree

2 files changed

+101
-62
lines changed

2 files changed

+101
-62
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
10591059
class StructFieldAccess
1060-
: public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> {
1060+
: public ConstStmtVisitor<StructFieldAccess, const Expr *> {
10611061
bool AddrOfSeen = false;
10621062

10631063
public:
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

Comments
 (0)