<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/142502>142502</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLVM/Clang does not process visionos availability correctly
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
stuartcarnie
</td>
</tr>
</table>
<pre>
The following snippet of Objective-C code, which declares the `typedef` as available on watchOS, and unavailable on iOS, macOS and tvOS platforms:
```objectivec
#import <Foundation/Foundation.h>
API_UNAVAILABLE(visionos) @interface Foo
@end
typedef void(^Bar)(Foo *foo) API_AVAILABLE(watchos(5.0)) API_UNAVAILABLE(ios,macos,tvos);
```
Given iOS is unavailable, it also includes derivatives, which means visionOS.
Compiling this snippet with Apple's clang compiler works as expected:
```
echo "#import <Foundation/Foundation.h>\nAPI_UNAVAILABLE(visionos) @interface Foo\n@end\n typedef void(^Bar)(Foo *foo) API_AVAILABLE(watchos(5.0)) API_UNAVAILABLE(ios,macos,tvos);" | xcrun -sdk xros clang -mtargetos=xros2.5 -O2 -x objective-c -c -o test.o -
```
However, compiling with clang from here fails:
```
echo -e "#import <Foundation/Foundation.h>\nAPI_UNAVAILABLE(visionos) @interface Foo\n@end\ntypedef void(^Bar)(Foo *foo) API_AVAILABLE(watchos(5.0)) API_UNAVAILABLE(ios,macos,tvos);" | arm-apple-darwin11-clang -isysroot /root/SDKs/XROS2.5.sdk/ -mtargetos=xros2.5 -O2 -x objective-c -c -o test.o -
```
**Output**:
```
<stdin>:4:20: error: 'Foo' is unavailable: not available on visionOS
4 | typedef void(^Bar)(Foo *foo) API_AVAILABLE(watchos(5.0)) API_UNAVAILABLE(ios,macos,tvos);
| ^ <stdin>:2:38: note: 'Foo' has been explicitly marked unavailable here 2 | API_UNAVAILABLE(visionos) @interface Foo
| ^
1 error generated.
```
If I explicitly add `visionos` to the `typedef` declaration, it passes.
Unfortunately, this problem occurs when compiling Apple's SDKs, such as `CoreMotion` with llvm / clang, that has declarations such as:
```objectivec
/*!
* @typedef CMDyskineticSymptomResultHandler
* @brief Completion handler for CMDyskineticSymptomResult values.
*/
typedef void(^CMDyskineticSymptomResultHandler)(NSArray<CMDyskineticSymptomResult *> * _Nonnull dyskineticSymptomResult, NSError * _Nullable error) API_AVAILABLE(watchos(5.0)) API_UNAVAILABLE(ios, macos, tvos);
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVl1v2zYU_TX0y4UFmZL88eAHRYnWYGk81Guxt4KiriwuFCmQlB3_-4GUndhriq7YsAQE5EjkvZfnnHtIZq3YKcQ1yW5Idjthg2u1WVs3MOM4M0rgpNL1cf17i9BoKfVBqB1YJfoeHegGNtWfyJ3Y47QArmsktIBDK3gLNXLJDFpwLQKZx-7YY40NmcfALLA9E5JVEkErODDH283Wr2WqhkFdfRXjl47xzTZ8d_vNFnrJXKNNZ0mSkziMeTwOfa6J-7c0EV2vjQOSFKUeVM2c0IrQ8vWfqCXJ3Rgk_-3-6-fH_Et-_5DfPNwRutwLK7TSltAVkDQWyqFpGEcotfZr0hhVPS4-bRH2WtSELkl2d8MMoStCl6XWQGjeaO3j-CyXOQIAPsUyi-KwYJxzXYnwM4qO8fB0-1ATSW4u9z4W8ovYYwAOhL2E0-MoHDBpNQjF5VCjhRqN2DOPl31lr0OmLIx732wjGOMWuuuF9BJwrbAvOjgI10Le9z7BwgKXTO2Ah7lo4KDNk_Wc43OP3GH9LWMkzpG3HiH6z_nKCvWTbGWFOtGVFQreiy1KgSwKeOZmUDC19RM8G31Gbdo5ZnbotCXJrX9PowymGwrTZ3jR9ZSDHxocWhdpmH6rgA_6gHs0nlD-QlrgaczTGN1BiwahYUK-0URnSqb4v7LyzqQw002ZF_K0ZuYg1Gw2PfEi7NEarR0QWvonoeX29ldLaPnHp82WRllk6ydCy_-MQUL92AyuH9z4-02SSFJYVwvlsU_ylCQ5jUmSAxqjjf9B6MKjTBd_94IkB6XdtROfG57EOQBAGkB5P1uD8OdrINkdXG-VkiRPlqdd4PVOW2ahQlTecqTgwskjdMw84fXhEvQ_Ev_Tvn9VGonz2Yg47FChYQ7r6FtK7xu4vyyJ1bU_GV8yzWNw-o3zcjxKTx0XHLxn1qKNxrCfVaONGxRzKI9-QjDn3uhKYgea88FYOLSoLqzg1a1HFRdgB956lybzuNAGP-qQbh6PriHlvvPSH-1jTMJcAPqiOnuO8sNDuQySnnkgCc09wGeVFR9vj_ZJKHSCb49d73T3Ce0g3QemaonmYkllhF-gu16iTw_tOAUabb4fB_ZMDiN4EKoo3zy6f1hHaIDHbW4MO5Kk-H6-0Lp3oeivj1qpQUqo357rgX3c3gUljfMHOWp17Od_2WRw7jJ4-_YwqddJvUpWbILr2SJdruL5iqaTdp0sVqxZVSyrcJbhjGZVlVZLzOpZtuLpHCdiTWOaxfOY0oQu0zRapclitaKLZrnAdI6Vt_iOCRl5JUXa7CbC2gHXs5RmMZ1IVqG04R5K6Ulj1F9JzdovmFbDzpI0lsI6-xrCCSdx_fDw5SOhZRGMutZog6_1RnO05zuMfrlyCincEbg2BrmTx8lg5Lp1rg-a9bosd8K1QxVx3RFa-lynx7Q32ouY0DLU7s3_VP5-Tf8KAAD__1agg-I">