https://github.com/bwendling created https://github.com/llvm/llvm-project/pull/125571
An LValueToRValue cast shouldn't be ignored, so bail out of the visitor if we encounter one. >From f5086e8af7b370aae43bee98493ded9c9f7aa9b2 Mon Sep 17 00:00:00 2001 From: Bill Wendling <mo...@google.com> Date: Mon, 3 Feb 2025 12:15:07 -0800 Subject: [PATCH] [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. --- clang/lib/CodeGen/CGBuiltin.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 11fa295dad9524..339bcd14c5bc8c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1055,20 +1055,20 @@ namespace { /// StructFieldAccess is a simple visitor class to grab the first MemberExpr /// from an Expr. It records any ArraySubscriptExpr we meet along the way. class StructFieldAccess - : public ConstStmtVisitor<StructFieldAccess, const MemberExpr *> { + : public ConstStmtVisitor<StructFieldAccess, const Expr *> { bool AddrOfSeen = false; public: const ArraySubscriptExpr *ASE = nullptr; - const MemberExpr *VisitMemberExpr(const MemberExpr *E) { + const Expr *VisitMemberExpr(const MemberExpr *E) { if (AddrOfSeen && E->getType()->isArrayType()) // Avoid forms like '&ptr->array'. return nullptr; return E; } - const MemberExpr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { + const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { if (ASE) // We don't support multiple subscripts. return nullptr; @@ -1077,17 +1077,19 @@ class StructFieldAccess ASE = E; return Visit(E->getBase()); } - const MemberExpr *VisitCastExpr(const CastExpr *E) { + const Expr *VisitCastExpr(const CastExpr *E) { + if (E->getCastKind() == CK_LValueToRValue) + return E; return Visit(E->getSubExpr()); } - const MemberExpr *VisitParenExpr(const ParenExpr *E) { + const Expr *VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); } - const MemberExpr *VisitUnaryAddrOf(const clang::UnaryOperator *E) { + const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) { AddrOfSeen = true; return Visit(E->getSubExpr()); } - const MemberExpr *VisitUnaryDeref(const clang::UnaryOperator *E) { + const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) { AddrOfSeen = false; return Visit(E->getSubExpr()); } @@ -1188,7 +1190,7 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE, // GCC does for consistency's sake. StructFieldAccess Visitor; - const MemberExpr *ME = Visitor.Visit(E); + const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Visitor.Visit(E)); if (!ME) return nullptr; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits