[llvm-branch-commits] [clang] Fix issue with references to fields (PR #177661)
Utkarsh Saxena via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jan 23 11:12:56 PST 2026
https://github.com/usx95 created https://github.com/llvm/llvm-project/pull/177661
None
>From 01ed562e5c7a918117b571b2b48c130a4ff7735e Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <usx at google.com>
Date: Fri, 23 Jan 2026 19:11:45 +0000
Subject: [PATCH] Fix issue with references to fields
---
.../Analysis/LifetimeSafety/FactsGenerator.cpp | 3 ++-
clang/test/Sema/warn-lifetime-safety.cpp | 15 +++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
index 47c919b7d139d..d1875ef8edb44 100644
--- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
@@ -218,7 +218,8 @@ void FactsGenerator::VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE) {
}
void FactsGenerator::VisitMemberExpr(const MemberExpr *ME) {
- if (isa<FieldDecl>(ME->getMemberDecl())) {
+ auto *MD = ME->getMemberDecl();
+ if (isa<FieldDecl>(MD) && doesDeclHaveStorage(MD)) {
assert(ME->isGLValue() && "Field member should be GL value");
OriginList *Dst = getOriginsList(*ME);
assert(Dst && "Field member should have an origin list as it is GL value");
diff --git a/clang/test/Sema/warn-lifetime-safety.cpp b/clang/test/Sema/warn-lifetime-safety.cpp
index 4272f660a4adf..baa19716a12e4 100644
--- a/clang/test/Sema/warn-lifetime-safety.cpp
+++ b/clang/test/Sema/warn-lifetime-safety.cpp
@@ -1553,4 +1553,19 @@ void uaf_anonymous_union() {
} // expected-note {{destroyed here}}
(void)ip; // expected-note {{later used here}}
}
+
+struct RefMember {
+ std::string& str_ref;
+ std::string* str_ptr;
+ std::string str;
+ RefMember();
+ ~RefMember();
+};
+
+std::string_view refMemberReturnView1(RefMember a) { return a.str_ref; }
+std::string_view refMemberReturnView2(RefMember a) { return *a.str_ptr; }
+std::string_view refMemberReturnView3(RefMember a) { return a.str; } // expected-warning {{address of stack memory is returned later}} expected-note {{returned here}}
+std::string& refMemberReturnRef1(RefMember a) { return a.str_ref; }
+std::string& refMemberReturnRef2(RefMember a) { return *a.str_ptr; }
+std::string& refMemberReturnRef3(RefMember a) { return a.str; } // expected-warning {{address of stack memory is returned later}} expected-note {{returned here}}
} // namespace field_access
More information about the llvm-branch-commits
mailing list