mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This removes a workaround from the module interface loader, which was forcing AppKit and UIKit to be rebuilt from their textual interfaces with C++ interop disabled, even if the current compilation explicitly enables it.
The workaround was previously put in place because of a compiler error:
```
error: type 'AttributeScopes.AppKitAttributes.StrikethroughStyleAttribute' does not conform to protocol 'AttributedStringKey'
note: possibly intended match 'AttributeScopes.AppKitAttributes.StrikethroughStyleAttribute.Value' (aka 'NSUnderlineStyle') does not conform to 'Hashable'
```
`NSUnderlineStyle` is a C/C++ type from AppKit that is declared using `NS_OPTIONS` macro. `NS_OPTIONS`/`CF_OPTIONS` macros have different expansions in C vs C++ language modes. The C++ expansions weren't handled correctly by ClangImporter, resulting in two distinct Swift types being created: a `typealias NSUnderlineStyle` which was marked as unavailable in Swift, and `enum NSUnderlineStyle`. This mostly worked fine, since the lookup logic was picking the enum during regular name lookup. However, this silently broke down when rebuilding the explicit conformance from `AppKit.swiftinterface`:
```
extension AppKit.NSUnderlineStyle : Swift.Hashable {}
```
Swift was picking the (unavailable) typealias when rebuilding this extension, which means the (available) enum wasn't getting the conformance.
This is verified by an existing test (`test/Interop/Cxx/objc-correctness/appkit-uikit.swift`).
rdar://142961112
24 lines
851 B
C
24 lines
851 B
C
#if __has_attribute(enum_extensibility)
|
|
#define __CF_ENUM_ATTRIBUTES __attribute__((enum_extensibility(open)))
|
|
#define __CF_CLOSED_ENUM_ATTRIBUTES __attribute__((enum_extensibility(closed)))
|
|
#define __CF_OPTIONS_ATTRIBUTES \
|
|
__attribute__((flag_enum, enum_extensibility(open)))
|
|
#else
|
|
#define __CF_ENUM_ATTRIBUTES
|
|
#define __CF_CLOSED_ENUM_ATTRIBUTES
|
|
#define __CF_OPTIONS_ATTRIBUTES
|
|
#endif
|
|
|
|
#if (__cplusplus)
|
|
#define CF_OPTIONS(_type, _name) __attribute__((availability(swift,unavailable))) _type _name; enum __CF_OPTIONS_ATTRIBUTES : _name
|
|
#else
|
|
#define CF_OPTIONS(_type, _name) enum __CF_OPTIONS_ATTRIBUTES _name : _type _name; enum _name : _type
|
|
#endif
|
|
|
|
#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)
|
|
|
|
typedef NS_OPTIONS(int, StandardNSOption) {
|
|
StandardNSOption1,
|
|
StandardNSOption2
|
|
};
|