llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Gábor Horváth (Xazax-hun) <details> <summary>Changes</summary> In case a method already is lifetimebound annotated we should not add a second annotation to the type. --- Full diff: https://github.com/llvm/llvm-project/pull/117194.diff 6 Files Affected: - (modified) clang/lib/Sema/CheckExprLifetime.cpp (+1-1) - (modified) clang/lib/Sema/CheckExprLifetime.h (+2) - (modified) clang/lib/Sema/SemaAPINotes.cpp (+3-1) - (modified) clang/test/APINotes/Inputs/Headers/Lifetimebound.apinotes (+4) - (modified) clang/test/APINotes/Inputs/Headers/Lifetimebound.h (+1) - (modified) clang/test/APINotes/lifetimebound.cpp (+1) ``````````diff diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp index 8886e5e307ddf8..182ac806d3c13e 100644 --- a/clang/lib/Sema/CheckExprLifetime.cpp +++ b/clang/lib/Sema/CheckExprLifetime.cpp @@ -498,7 +498,7 @@ static bool isNormalAssignmentOperator(const FunctionDecl *FD) { return false; } -static bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD) { +bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD) { const TypeSourceInfo *TSI = FD->getTypeSourceInfo(); if (!TSI) return false; diff --git a/clang/lib/Sema/CheckExprLifetime.h b/clang/lib/Sema/CheckExprLifetime.h index 38b7061988dc78..b10c84363527a7 100644 --- a/clang/lib/Sema/CheckExprLifetime.h +++ b/clang/lib/Sema/CheckExprLifetime.h @@ -57,6 +57,8 @@ void checkCaptureByLifetime(Sema &SemaRef, const CapturingEntity &Entity, void checkExprLifetimeMustTailArg(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init); +bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD); + } // namespace clang::sema #endif // LLVM_CLANG_SEMA_CHECK_EXPR_LIFETIME_H diff --git a/clang/lib/Sema/SemaAPINotes.cpp b/clang/lib/Sema/SemaAPINotes.cpp index cbc092195ad30e..028bf82f3e8040 100644 --- a/clang/lib/Sema/SemaAPINotes.cpp +++ b/clang/lib/Sema/SemaAPINotes.cpp @@ -10,6 +10,7 @@ // //===----------------------------------------------------------------------===// +#include "CheckExprLifetime.h" #include "TypeLocBuilder.h" #include "clang/APINotes/APINotesReader.h" #include "clang/AST/Decl.h" @@ -568,7 +569,8 @@ static void ProcessAPINotes(Sema &S, FunctionOrMethod AnyFunc, static void ProcessAPINotes(Sema &S, CXXMethodDecl *Method, const api_notes::CXXMethodInfo &Info, VersionedInfoMetadata Metadata) { - if (Info.This && Info.This->isLifetimebound()) { + if (Info.This && Info.This->isLifetimebound() && + !sema::implicitObjectParamIsLifetimeBound(Method)) { auto MethodType = Method->getType(); auto *attr = ::new (S.Context) LifetimeBoundAttr(S.Context, getPlaceholderAttrInfo()); diff --git a/clang/test/APINotes/Inputs/Headers/Lifetimebound.apinotes b/clang/test/APINotes/Inputs/Headers/Lifetimebound.apinotes index 4bd5fbb42bf04c..0cdd855c0a053c 100644 --- a/clang/test/APINotes/Inputs/Headers/Lifetimebound.apinotes +++ b/clang/test/APINotes/Inputs/Headers/Lifetimebound.apinotes @@ -12,6 +12,10 @@ Tags: Parameters: - Position: -1 Lifetimebound: true + - Name: annotateThis2 + Parameters: + - Position: -1 + Lifetimebound: true - Name: methodToAnnotate Parameters: - Position: 0 diff --git a/clang/test/APINotes/Inputs/Headers/Lifetimebound.h b/clang/test/APINotes/Inputs/Headers/Lifetimebound.h index be0ed14945008f..b8097c202d8dd2 100644 --- a/clang/test/APINotes/Inputs/Headers/Lifetimebound.h +++ b/clang/test/APINotes/Inputs/Headers/Lifetimebound.h @@ -3,5 +3,6 @@ int *funcToAnnotate(int *p); struct MyClass { MyClass(int*); int *annotateThis(); + int *annotateThis2() [[clang::lifetimebound]]; int *methodToAnnotate(int *p); }; diff --git a/clang/test/APINotes/lifetimebound.cpp b/clang/test/APINotes/lifetimebound.cpp index 3cdba0136a5282..f6fdb8535b1815 100644 --- a/clang/test/APINotes/lifetimebound.cpp +++ b/clang/test/APINotes/lifetimebound.cpp @@ -14,3 +14,4 @@ // CHECK-METHOD-NEXT: LifetimeBoundAttr // CHECK-METHOD-THIS: CXXMethodDecl {{.+}} annotateThis 'int *() {{\[\[}}clang::lifetimebound{{\]\]}}' +// CHECK-METHOD-THIS: CXXMethodDecl {{.+}} annotateThis2 'int *() {{\[\[}}clang::lifetimebound{{\]\]}}' `````````` </details> https://github.com/llvm/llvm-project/pull/117194 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits