[clang] [clang][APINotes] Do not add duplicate lifetimebound annotation (PR #117194)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 21 09:20:56 PST 2024
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
More information about the cfe-commits
mailing list