llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Haojian Wu (hokein) <details> <summary>Changes</summary> This issue is identified during the discussion of [this comment](https://github.com/llvm/llvm-project/issues/112234#issuecomment-2426102198). There will be no release note for this fix as it is a follow-up to [#<!-- -->106997](https://github.com/llvm/llvm-project/pull/106997). --- Full diff: https://github.com/llvm/llvm-project/pull/113180.diff 3 Files Affected: - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+1-1) - (modified) clang/lib/Sema/CheckExprLifetime.cpp (+15-7) - (modified) clang/test/SemaCXX/attr-lifetimebound.cpp (+3-3) ``````````diff diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 883db838ca0147..ca25d49aec4501 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10188,7 +10188,7 @@ def warn_new_dangling_initializer_list : Warning< "will be destroyed at the end of the full-expression">, InGroup<DanglingInitializerList>; def warn_dangling_pointer_assignment : Warning< - "object backing the pointer %0 " + "object backing the %select{|pointer }0%1 " "will be destroyed at the end of the full-expression">, InGroup<DanglingAssignment>; diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp index 8caeae5fcf9f8e..aa0a2e223e708f 100644 --- a/clang/lib/Sema/CheckExprLifetime.cpp +++ b/clang/lib/Sema/CheckExprLifetime.cpp @@ -1206,11 +1206,13 @@ static void checkExprLifetimeImpl(Sema &SemaRef, assert(shouldLifetimeExtendThroughPath(Path) == PathLifetimeKind::NoExtend && "No lifetime extension for assignments"); - SemaRef.Diag(DiagLoc, - IsGslPtrValueFromGslTempOwner - ? diag::warn_dangling_lifetime_pointer_assignment - : diag::warn_dangling_pointer_assignment) - << AEntity->LHS << DiagRange; + if (IsGslPtrValueFromGslTempOwner) + SemaRef.Diag(DiagLoc, diag::warn_dangling_lifetime_pointer_assignment) + << AEntity->LHS << DiagRange; + else + SemaRef.Diag(DiagLoc, diag::warn_dangling_pointer_assignment) + << AEntity->LHS->getType()->isPointerType() << AEntity->LHS + << DiagRange; return false; } case LK_MemInitializer: { @@ -1412,8 +1414,14 @@ static void checkExprLifetimeImpl(Sema &SemaRef, }; llvm::SmallVector<IndirectLocalPathEntry, 8> Path; - if (LK == LK_Assignment && shouldRunGSLAssignmentAnalysis(SemaRef, *AEntity)) - Path.push_back({IndirectLocalPathEntry::GslPointerAssignment, Init}); + if (LK == LK_Assignment && + shouldRunGSLAssignmentAnalysis(SemaRef, *AEntity)) { + Path.push_back( + {isAssignmentOperatorLifetimeBound(AEntity->AssignmentOperator) + ? IndirectLocalPathEntry::LifetimeBoundCall + : IndirectLocalPathEntry::GslPointerAssignment, + Init}); + } if (Init->isGLValue()) visitLocalsRetainedByReferenceBinding(Path, Init, RK_ReferenceBinding, diff --git a/clang/test/SemaCXX/attr-lifetimebound.cpp b/clang/test/SemaCXX/attr-lifetimebound.cpp index d04bbb32433fb5..990e55ce057116 100644 --- a/clang/test/SemaCXX/attr-lifetimebound.cpp +++ b/clang/test/SemaCXX/attr-lifetimebound.cpp @@ -330,8 +330,8 @@ struct StatusOr { }; void test(StatusOr<FooView> foo1, StatusOr<NonAnnotatedFooView> foo2) { - foo1 = Foo(); // expected-warning {{object backing the pointer foo1 will be destroyed at the end}} - // No warning on non-gsl annotated types. - foo2 = NonAnnotatedFoo(); + foo1 = Foo(); // expected-warning {{object backing the foo1 will be destroyed at the end}} + // This warning is triggered by the lifetimebound annotation, regardless of whether the class type is annotated with GSL. + foo2 = NonAnnotatedFoo(); // expected-warning {{object backing the foo2 will be destroyed at the end}} } } // namespace GH106372 `````````` </details> https://github.com/llvm/llvm-project/pull/113180 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits