https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/177878
>From 994bbf8db0fe300080c6a988fd46b5de35cf92fc Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <[email protected]> Date: Tue, 27 Jan 2026 17:55:56 +0000 Subject: [PATCH] [LifetimeSafety] Handle temporaries of non-trivial view types --- .../Analyses/LifetimeSafety/FactsGenerator.h | 1 + .../LifetimeSafety/FactsGenerator.cpp | 17 ++++++++------ clang/test/Sema/warn-lifetime-safety.cpp | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h b/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h index e4487b0d1dbc7..8b45337bee218 100644 --- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h +++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h @@ -48,6 +48,7 @@ class FactsGenerator : public ConstStmtVisitor<FactsGenerator> { void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *OCE); void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *FCE); void VisitInitListExpr(const InitListExpr *ILE); + void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE); void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE); private: diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp index c1b8322c5ec55..fb859eeb856af 100644 --- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp +++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp @@ -418,12 +418,14 @@ void FactsGenerator::VisitInitListExpr(const InitListExpr *ILE) { killAndFlowOrigin(*ILE, *ILE->getInit(0)); } +void FactsGenerator::VisitCXXBindTemporaryExpr( + const CXXBindTemporaryExpr *BTE) { + killAndFlowOrigin(*BTE, *BTE->getSubExpr()); +} + void FactsGenerator::VisitMaterializeTemporaryExpr( const MaterializeTemporaryExpr *MTE) { assert(MTE->isGLValue()); - // We defer from handling lifetime extended materializations. - if (MTE->getStorageDuration() != SD_FullExpression) - return; OriginList *MTEList = getOriginsList(*MTE); if (!MTEList) return; @@ -431,15 +433,16 @@ void FactsGenerator::VisitMaterializeTemporaryExpr( assert((!SubExprList || MTEList->getLength() == (SubExprList->getLength() + 1)) && "MTE top level origin should contain a loan to the MTE itself"); - MTEList = getRValueOrigins(MTE, MTEList); + + OriginList *RValMTEList = getRValueOrigins(MTE, MTEList); + flow(RValMTEList, SubExprList, /*Kill=*/true); + OriginID OuterMTEID = MTEList->getOuterOriginID(); if (getChildBinding(MTE)) { // Issue a loan to MTE for the storage location represented by MTE. const Loan *L = createLoan(FactMgr, MTE); - OriginList *List = getOriginsList(*MTE); CurrentBlockFacts.push_back( - FactMgr.createFact<IssueFact>(L->getID(), List->getOuterOriginID())); + FactMgr.createFact<IssueFact>(L->getID(), OuterMTEID)); } - flow(MTEList, SubExprList, /*Kill=*/true); } void FactsGenerator::handleLifetimeEnds(const CFGLifetimeEnds &LifetimeEnds) { diff --git a/clang/test/Sema/warn-lifetime-safety.cpp b/clang/test/Sema/warn-lifetime-safety.cpp index c80556715fedf..2976c809e389c 100644 --- a/clang/test/Sema/warn-lifetime-safety.cpp +++ b/clang/test/Sema/warn-lifetime-safety.cpp @@ -1691,3 +1691,25 @@ void test() { } } // namespace attr_on_template_params + +namespace non_trivial_views { +struct [[gsl::Pointer]] View { + View(const std::string&); + ~View(); // Forces a CXXBindTemporaryExpr. +}; + +View test1(std::string a) { + // Make sure we handle CXXBindTemporaryExpr of view types. + return View(a); // expected-warning {{address of stack memory is returned later}} expected-note {{returned here}} +} + +View test2(std::string a) { + View b = View(a); // expected-warning {{address of stack memory is returned later}} + return b; // expected-note {{returned here}} +} + +View test3(std::string a) { + const View& b = View(a); // expected-warning {{address of stack memory is returned later}} + return b; // expected-note {{returned here}} +} +} // namespace non_trivial_views _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
