Files
swift-mirror/test/Interop/Cxx/enum/Inputs/anonymous-with-swift-name.h
John Hui 89f8855ad6 [cxx-interop] Check for NS_OPTIONS macro in findOptionSetEnum()
importer::findOptionSetEnum() uses some fragile heuristics to determine
whether a typedef is involved in the construction of a CF_OPTIONS or
NS_OPTIONS type. This patch adds an explicit check that the typedef is
expanded from either of those macros, to prevent, e.g., an unavailable
NS_ENUM, from being mistakenly recognized as an NS_OPTIONS.

Note that doing this is still kind of fragile, and prevents users from
building {NS,CF}_OPTIONS with their own macros. The right thing to do is
probably specifically look for the flag_enum attribute, but that is not
currently what we're doing for reasons whose discovery is left as
an exercise to the future git archaeologist.

This patch also removes (part of) a test case that builds
a CF_OPTIONS-like type with the "SOME_OPTIONS" macro, which is no longer
supported as of this patch.

rdar://150399978
2025-05-21 15:01:09 -07:00

50 lines
1.7 KiB
Objective-C

#ifndef TEST_INTEROP_CXX_ENUM_INPUTS_ANONYMOUS_WITH_SWIFT_NAME_H
#define TEST_INTEROP_CXX_ENUM_INPUTS_ANONYMOUS_WITH_SWIFT_NAME_H
#define CF_OPTIONS(_type, _name) __attribute__((availability(swift, unavailable))) _type _name; enum : _name
typedef CF_OPTIONS(unsigned, CFColorMask) {
kCFColorMaskRed = (1 << 1),
kCFColorMaskGreen = (1 << 2),
kCFColorMaskBlue = (1 << 3),
kCFColorMaskAll = ~0U
};
inline CFColorMask useCFColorMask(CFColorMask mask) { return mask; }
struct ParentStruct { };
inline CFColorMask renameCFColorMask(ParentStruct parent)
__attribute__((swift_name("ParentStruct.childFn(self:)")))
{ return kCFColorMaskRed; }
inline CFColorMask getCFColorMask(ParentStruct parent)
__attribute__((swift_name("getter:ParentStruct.colorProp(self:)")))
{ return kCFColorMaskRed; }
inline void setCFColorMask(ParentStruct parent, CFColorMask newValue)
__attribute__((swift_name("setter:ParentStruct.colorProp(self:newValue:)")))
{ }
typedef __attribute__((availability(swift, unavailable))) __attribute__((swift_name("ParentStruct.NewName"))) unsigned OldName;
enum __attribute__((flag_enum,enum_extensibility(open))) : OldName {
kOldNameOne = (1 << 1),
kOldNameTwo = (1 << 2)
};
typedef __attribute__((availability(swift, unavailable))) __attribute__((swift_name("GlobalNewName"))) unsigned GlobalOldName;
enum __attribute__((flag_enum,enum_extensibility(open))) : GlobalOldName {
kGlobalOldNameOne = (1 << 1),
kGlobalOldNameTwo = (1 << 2)
};
#if __OBJC__
@interface ColorMaker
- (void)makeOtherColorWithInt:(int) x withOptions:(CFColorMask)opts;
@end
#endif // SWIFT_OBJC_INTEROP
#endif // TEST_INTEROP_CXX_ENUM_INPUTS_ANONYMOUS_WITH_SWIFT_NAME_H