aaron.ballman added a comment.

In D70469#1766084 <https://reviews.llvm.org/D70469#1766084>, @xazax.hun wrote:

> @aaron.ballman
>
> Type attributes are definitely more flexible as in they can be applied in 
> more contexts. These attributes, however, make no sense outside of a function 
> declaration, or maybe a type alias.


Function pointers are a primary case for what I was thinking of, and those are 
neither a function declaration nor a type alias.

> So I feel like we could argue on both sides. I made a minimal version of the 
> attribute so it can potentially unblock dependent revisions (the static 
> analyzer changes) and plan to add more diagnostics in follow-up patches. What 
> do you think?

Thank you! I think this is a more flexible way forward.

In D70469#1770041 <https://reviews.llvm.org/D70469#1770041>, @xazax.hun wrote:

> In the meantime, I realized lambdas are actually not that important. Lambdas 
> are only usable in C++, and in C++ one should prefer to use move only RAII 
> wrapper for handles.


Generally yes, but thinking of things like file descriptors (which are also 
handles), it seems like overkill to expect someone to wrap those in a separate 
type.

> This reduces the problem into a use after move and we already have a check 
> for that. These annotations are more important for C, where we do not have 
> language features to mitigate these problems. The function pointer argument 
> is still valid though.

Okay, that's a fair point.



================
Comment at: clang/include/clang/Basic/Attr.td:3464
+
+def AcquireHandle : TypeAttr {
+  let Spellings = [Clang<"acquire_handle">];
----------------
These probably should be `DeclOrTypeAttr` because they can be applied to a 
parameter (which is a declaration) or a type.


================
Comment at: clang/include/clang/Basic/AttrDocs.td:4569
+
+def HandleDocs : DocumentationCategory<"Handle Attributes"> {
+  let Content = [{
----------------
The docs should clarify when they say "function" that they mean the function 
type rather than the function declaration.


================
Comment at: clang/lib/Sema/SemaType.cpp:7412
+                         diag::warn_type_attribute_wrong_type_str)
+        << Attr.getAttrName()->getName() << "non-function" << CurType;
+    return;
----------------
You should be able to pass in `Attr` directly instead of 
`Attr.getAttrName()->getName()`, I believe. Also, I'd prefer the `non-function` 
be put into the diagnostic text itself with a `%select` if we need to vary it.


================
Comment at: clang/test/Sema/attr-handles.cpp:7
+    int __attribute__((acquire_handle)) { return 0; };
+void g(int __attribute__((acquire_handle)) a); // TODO: diagnose this. The 
acquire attribute only makes sense for outputs.
+void h(int __attribute__((acquire_handle(1))) *a); // expected-error 
{{'acquire_handle' attribute takes no arguments}}
----------------
Are you planning to implement the TODOs as part of this patch?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70469/new/

https://reviews.llvm.org/D70469



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to