[PATCH] D54912: [attributes] Add a family of OS_CONSUMED, OS_RETURNS and OS_RETURNS_RETAINED attributes

Aaron Ballman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 1 09:46:41 PST 2018


aaron.ballman added inline comments.


================
Comment at: cfe/trunk/lib/Sema/SemaDeclAttr.cpp:4862
+    case ParsedAttr::AT_OSReturnsNotRetained:
       ExpectedDeclKind = ExpectedFunctionOrMethod;
       break;
----------------
george.karpenkov wrote:
> aaron.ballman wrote:
> > george.karpenkov wrote:
> > > aaron.ballman wrote:
> > > > I mentioned that I could fix this up in another patch, but there's a different subtlety here -- you can apply NSReturnsRetained and friends to types. See test\SemaObjC\attr-ns_returns_retained.m for an example -- where it's being added to a block type. It also seems to appertain to block literals (test\SemaObjC\block-literal-with-attribute.m).
> > > > 
> > > > Should the OS versions also apply to types and block literals?
> > > OS versions should not apply to block literals, neither they should be applicable to block types.
> > Can you add some tests to ensure it's properly diagnosed?
> @aaron.ballman Do you mean something like this?
> 
> ```
> diff --git a/clang/test/Sema/attr-osobject.mm b/clang/test/Sema/attr-osobject.mm
> index dbd9122a8fa..ffb4394e4bc 100644
> --- a/clang/test/Sema/attr-osobject.mm
> +++ b/clang/test/Sema/attr-osobject.mm
> @@ -1,6 +1,4 @@
> -// RUN: %clang_cc1 -fsyntax-only -verify %s
> -
> -// expected-no-diagnostics
> +// RUN: %clang_cc1 -fsyntax-only -fblocks -verify %s
> 
>  struct S {};
> 
> @@ -9,3 +7,5 @@ @interface I
>    - (S*) generateS __attribute__((os_returns_retained));
>    - (void) takeS:(S*) __attribute__((os_consumed)) s;
>  @end
> +
> +typedef __attribute__((os_returns_retained)) id (^blockType)(); // expected-warning{{'os_returns_retained' attribute only applies to functions, Objective-C methods, and Objective-C properties}}
> ```
Yup! Also:
```
__auto_type b = ^ id (id filter)  __attribute__((os_returns_retained))  {
  return filter;
};
```
This is accepted by ns_returns_retained, so it would be good to clearly show it's not supported by os_returns_retained.


Repository:
  rL LLVM

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

https://reviews.llvm.org/D54912





More information about the llvm-commits mailing list