llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Haojian Wu (hokein) <details> <summary>Changes</summary> This is a follow up of https://github.com/llvm/llvm-project/pull/107213, supporting the assignment case. With this patch, clang now diagnoses cases where a dangling `container<pointer>` is assigned, e.g. ``` void test() { std::vector<string_view> v; v = {std::string()}; // dangling } ``` Fixes #<!-- -->100526 --- Full diff: https://github.com/llvm/llvm-project/pull/108205.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/lib/Sema/CheckExprLifetime.cpp (+2-1) - (modified) clang/test/Sema/warn-lifetime-analysis-nocfg.cpp (+8-2) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 59ccdf1e15cd81..43f0d6eb4f2edc 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -300,6 +300,8 @@ Improvements to Clang's diagnostics - Clang now diagnoses cases where a dangling ``GSLOwner<GSLPointer>`` object is constructed, e.g. ``std::vector<string_view> v = {std::string()};`` (#GH100526). +- Clang now diagnoses cases where a dangling ``GSLOwner<GSLPointer>`` object is assigned, e.g. ``v = {std::string()};`` (#GH100526). + Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp index c8e703036c132c..6fc1d4d0aae259 100644 --- a/clang/lib/Sema/CheckExprLifetime.cpp +++ b/clang/lib/Sema/CheckExprLifetime.cpp @@ -982,7 +982,8 @@ static bool shouldRunGSLAssignmentAnalysis(const Sema &SemaRef, diag::warn_dangling_lifetime_pointer_assignment, SourceLocation()); return (EnableGSLAssignmentWarnings && (isRecordWithAttr<PointerAttr>(Entity.LHS->getType()) || - isAssignmentOperatorLifetimeBound(Entity.AssignmentOperator))); + isAssignmentOperatorLifetimeBound(Entity.AssignmentOperator) || + isContainerOfPointer(Entity.LHS->getType()->getAsRecordDecl()))); } static void checkExprLifetimeImpl(Sema &SemaRef, diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index 234e06f069074b..d744140800f595 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -601,17 +601,23 @@ void test() { std::optional<std::string_view> o4 = std::optional<std::string_view>(s); // FIXME: should work for assignment cases - v1 = {std::string()}; - o1 = std::string(); + v1 = {std::string()}; // expected-warning {{object backing the pointer}} + o1 = std::string(); // expected-warning {{object backing the pointer}} // no warning on copying pointers. std::vector<std::string_view> n1 = {std::string_view()}; + n1 = {std::string_view()}; std::optional<std::string_view> n2 = {std::string_view()}; + n2 = {std::string_view()}; std::optional<std::string_view> n3 = std::string_view(); + n3 = std::string_view(); std::optional<std::string_view> n4 = std::make_optional(std::string_view()); + n4 = std::make_optional(std::string_view()); const char* b = ""; std::optional<std::string_view> n5 = std::make_optional(b); + n5 = std::make_optional(b); std::optional<std::string_view> n6 = std::make_optional("test"); + n6 = std::make_optional("test"); } std::vector<std::string_view> test2(int i) { `````````` </details> https://github.com/llvm/llvm-project/pull/108205 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits