https://github.com/hokein updated https://github.com/llvm/llvm-project/pull/127460
>From 3601ae837475da3c473f5be9c17687c439495ded Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 17 Feb 2025 10:08:14 +0100 Subject: [PATCH 1/3] [clang] Fix false positive regression for lifetime analysis warning. --- clang/lib/Sema/CheckExprLifetime.cpp | 5 ++-- clang/test/Sema/Inputs/lifetime-analysis.h | 2 ++ .../Sema/warn-lifetime-analysis-nocfg.cpp | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp index 8963cad86dbca..3e0867343ccee 100644 --- a/clang/lib/Sema/CheckExprLifetime.cpp +++ b/clang/lib/Sema/CheckExprLifetime.cpp @@ -1239,11 +1239,12 @@ static AnalysisResult analyzePathForGSLPointer(const IndirectLocalPath &Path, } // Check the return type, e.g. // const GSLOwner& func(const Foo& foo [[clang::lifetimebound]]) + // GSLOwner* func(cosnt Foo& foo [[clang::lifetimebound]]) // GSLPointer func(const Foo& foo [[clang::lifetimebound]]) if (FD && - ((FD->getReturnType()->isReferenceType() && + ((FD->getReturnType()->isPointerOrReferenceType() && isRecordWithAttr<OwnerAttr>(FD->getReturnType()->getPointeeType())) || - isPointerLikeType(FD->getReturnType()))) + isGLSPointerType(FD->getReturnType()))) return Report; return Abandon; diff --git a/clang/test/Sema/Inputs/lifetime-analysis.h b/clang/test/Sema/Inputs/lifetime-analysis.h index d318033ff0cc4..2072e4603cead 100644 --- a/clang/test/Sema/Inputs/lifetime-analysis.h +++ b/clang/test/Sema/Inputs/lifetime-analysis.h @@ -61,6 +61,7 @@ struct basic_string_view { basic_string_view(); basic_string_view(const T *); const T *begin() const; + const T *data() const; }; using string_view = basic_string_view<char>; @@ -80,6 +81,7 @@ struct basic_string { const T *c_str() const; operator basic_string_view<T> () const; using const_iterator = iter<T>; + const T *data() const; }; using string = basic_string<char>; diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index 04bb1330ded4c..a65bb936ca8cb 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -852,3 +852,27 @@ struct Test { }; } // namespace GH120543 + +namespace GH127195 { +template <typename T> +struct StatusOr { + T* operator->() [[clang::lifetimebound]]; + T* value() [[clang::lifetimebound]]; +}; + +const char* foo() { + StatusOr<std::string> s; + return s->data(); // expected-warning {{address of stack memory associated with local variable}} + + StatusOr<std::string_view> s2; + return s2->data(); + + StatusOr<StatusOr<std::string_view>> s3; + return s3.value()->value()->data(); + + // would be nice to support the nested cases. + StatusOr<StatusOr<std::string>> s4; + return s4.value()->value()->data(); +} + +} // namespace GH127195 >From 29e49e18339c7c2f2e9694c37a859967922c89e8 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 17 Feb 2025 14:23:39 +0100 Subject: [PATCH 2/3] add FIXME --- clang/test/Sema/warn-lifetime-analysis-nocfg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index a65bb936ca8cb..66a2a19ceb321 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -870,7 +870,7 @@ const char* foo() { StatusOr<StatusOr<std::string_view>> s3; return s3.value()->value()->data(); - // would be nice to support the nested cases. + // FIXME: nested cases are not supported now. StatusOr<StatusOr<std::string>> s4; return s4.value()->value()->data(); } >From 3f102069a5af3bd777e827735ea46d158a042193 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 17 Feb 2025 14:27:57 +0100 Subject: [PATCH 3/3] clang-format --- clang/lib/Sema/CheckExprLifetime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp index 3e0867343ccee..1f87001f35b57 100644 --- a/clang/lib/Sema/CheckExprLifetime.cpp +++ b/clang/lib/Sema/CheckExprLifetime.cpp @@ -1244,7 +1244,7 @@ static AnalysisResult analyzePathForGSLPointer(const IndirectLocalPath &Path, if (FD && ((FD->getReturnType()->isPointerOrReferenceType() && isRecordWithAttr<OwnerAttr>(FD->getReturnType()->getPointeeType())) || - isGLSPointerType(FD->getReturnType()))) + isGLSPointerType(FD->getReturnType()))) return Report; return Abandon; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits