[clang] [Clang][counted-by] Bail out of visitor for LValueToRValue cast (PR #125571)
Bill Wendling via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 3 12:20:38 PST 2025
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 <morbo at 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;
More information about the cfe-commits
mailing list