llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Utkarsh Saxena (usx95) <details> <summary>Changes</summary> Fixes https://github.com/llvm/llvm-project/issues/177604 Added tests to verify that reference members are handled correctly, showing that returning a reference member doesn't trigger a false positive warning, while returning a value member still correctly produces a warning. --- Full diff: https://github.com/llvm/llvm-project/pull/177661.diff 2 Files Affected: - (modified) clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp (+2-1) - (modified) clang/test/Sema/warn-lifetime-safety.cpp (+15) ``````````diff 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 `````````` </details> https://github.com/llvm/llvm-project/pull/177661 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
