-
Notifications
You must be signed in to change notification settings - Fork 13.3k
[clang] Output an error when [[lifetimebound]] attribute is applied on a function parameter while the function returns void #113460
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…on a function parameter while the function returns void.
@llvm/pr-subscribers-clang Author: Boaz Brickner (bricknerb) ChangesFixes: #107556 Full diff: https://github.com/llvm/llvm-project/pull/113460.diff 3 Files Affected:
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 8e4718008ece72..a1c20b22e736ed 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -10097,6 +10097,9 @@ def err_lifetimebound_no_object_param : Error<
def err_lifetimebound_ctor_dtor : Error<
"'lifetimebound' attribute cannot be applied to a "
"%select{constructor|destructor}0">;
+def err_lifetimebound_void_return_type : Error<
+ "'lifetimebound' attribute cannot be applied to a parameter of a function "
+ "that returns void; did you mean 'lifetime_capture_by(X)'">;
// CHECK: returning address/reference of stack memory
def warn_ret_stack_addr_ref : Warning<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 229c9080d558ec..e611bf60718bc5 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6940,7 +6940,7 @@ static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
}
}
- // Check the attributes on the function type, if any.
+ // Check the attributes on the function type and function params, if any.
if (const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
// Don't declare this variable in the second operand of the for-statement;
// GCC miscompiles that by ending its lifetime before evaluating the
@@ -6970,6 +6970,18 @@ static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
}
}
}
+
+ for (unsigned int I = 0; I < FD->getNumParams(); ++I) {
+ const ParmVarDecl *P = FD->getParamDecl(I);
+
+ // The [[lifetimebound]] attribute can be applied to a function parameter
+ // only if the function returns a value.
+ if (auto *A = P->getAttr<LifetimeBoundAttr>()) {
+ if (!isa<CXXConstructorDecl>(FD) && FD->getReturnType()->isVoidType()) {
+ S.Diag(A->getLocation(), diag::err_lifetimebound_void_return_type);
+ }
+ }
+ }
}
}
diff --git a/clang/test/SemaCXX/attr-lifetimebound.cpp b/clang/test/SemaCXX/attr-lifetimebound.cpp
index 1c5c79777c71c8..f790559b6b4769 100644
--- a/clang/test/SemaCXX/attr-lifetimebound.cpp
+++ b/clang/test/SemaCXX/attr-lifetimebound.cpp
@@ -1,8 +1,7 @@
// RUN: %clang_cc1 -std=c++23 -verify %s
namespace usage_invalid {
- // FIXME: Should we diagnose a void return type?
- void voidreturn(int ¶m [[clang::lifetimebound]]);
+ void voidreturn(int ¶m [[clang::lifetimebound]]); // expected-error {{'lifetimebound' attribute cannot be applied to a parameter of a function that returns void; did you mean 'lifetime_capture_by(X)'}}
int *not_class_member() [[clang::lifetimebound]]; // expected-error {{non-member function has no implicit object parameter}}
struct A {
|
…ype is dependent on template argument but actually void.
… void. This should diagnose but currently isn't. Added a FIXME comment.
…ror diagnostics that is generated when a function that returns void has [[clang::lifetimebound]] applied to one or more of its parameters.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM modulo comment. Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
small nit for one more test.
…n a function parameter while the function returns void (llvm#113460) Fixes: llvm#107556
Fixes: #107556