llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Haojian Wu (hokein) <details> <summary>Changes</summary> This fixes a false positive caused by #<!-- -->114044. For `GSLPointer*` types, it's less clear whether the lifetime issue is about the GSLPointer object itself or the owner it points to. To avoid false positives, we take a conservative approach in our heuristic. Fixes #<!-- -->127195 (This will be backported to release 20). --- Full diff: https://github.com/llvm/llvm-project/pull/127460.diff 2 Files Affected: - (modified) clang/lib/Sema/CheckExprLifetime.cpp (+3-2) - (modified) clang/test/Sema/warn-lifetime-analysis-nocfg.cpp (+25) ``````````diff 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/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index 04bb1330ded4c..e2bad643ef012 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -852,3 +852,28 @@ 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 + \ No newline at end of file `````````` </details> https://github.com/llvm/llvm-project/pull/127460 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits