mirror of
https://github.com/apple/swift.git
synced 2026-10-18 17:49:23 +02:00
That is, when we have:
struct Foo {
enum Bar { B1, B2 };
};
We should be able to access Foo.B1 and Foo.B2 in Swift just as we would
access Foo::B1 and Foo::B2 in C++.
The previous commit makes this lookup possible, but doesn't load those
members when dumping the module interface. This patch fixes the member
loading path.
Furthermore, it *broke* ObjC interop, whereby those enum members were
available at the top-level scope, to be consistent with C scoping rules.
This patch fixes that by changing the effective Clang context for such
enums to be the enclosing struct, rather than the translation unit.
Closes #54905
Closes #62127
rdar://175283372
87 lines
5.2 KiB
Swift
87 lines
5.2 KiB
Swift
// Test module interface produced for C++ access specifiers test.
|
|
// Public C++ members should be imported with Swift-public access, and
|
|
// private C++ members should be imported with Swift-private access.
|
|
|
|
// RUN: %target-swift-ide-test -print-module -module-to-print=AccessSpecifiers -print-access -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
|
|
// REQUIRES: swift_feature_ImportNonPublicCxxMembers
|
|
|
|
// CHECK: public struct PublicPrivate {
|
|
// CHECK-NEXT: public init()
|
|
// CHECK-NEXT: public var PublicMemberVar: Int32
|
|
// CHECK-NEXT: public static var PublicStaticMemberVar: Int32
|
|
// CHECK-NEXT: public mutating func publicMemberFunc()
|
|
// CHECK-NEXT: public typealias PublicTypedef = Int32
|
|
// CHECK-NEXT: public struct PublicStruct {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: public struct PublicEnum : Hashable, Equatable, RawRepresentable {
|
|
// CHECK-NEXT: public init(_ rawValue: [[ENUM_UNDERLYING_TYPE:Int32|UInt32]])
|
|
// CHECK-NEXT: public init(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: public var rawValue: [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: public typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: public static var PublicEnumValue1: PublicPrivate.PublicEnum { get }
|
|
// CHECK-NEXT: public static var PublicAnonymousEnumValue1: Int { get }
|
|
// CHECK-NEXT: @frozen public enum PublicClosedEnum : [[ENUM_UNDERLYING_TYPE]], @unchecked Sendable {
|
|
// CHECK-NEXT: public init?(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: public var rawValue: [[ENUM_UNDERLYING_TYPE]] { get }
|
|
// CHECK-NEXT: public typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: case value1
|
|
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "value1")
|
|
// CHECK-NEXT: public static var Value1: PublicPrivate.PublicClosedEnum { get }
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: public enum PublicOpenEnum : [[ENUM_UNDERLYING_TYPE]], @unchecked Sendable {
|
|
// CHECK-NEXT: public init?(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: public var rawValue: [[ENUM_UNDERLYING_TYPE]] { get }
|
|
// CHECK-NEXT: public typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: case value1
|
|
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "value1")
|
|
// CHECK-NEXT: public static var Value1: PublicPrivate.PublicOpenEnum { get }
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: public struct PublicFlagEnum : OptionSet, @unchecked Sendable {
|
|
// CHECK-NEXT: public init(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: public let rawValue: [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: public typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: public typealias Element = PublicPrivate.PublicFlagEnum
|
|
// CHECK-NEXT: public typealias ArrayLiteralElement = PublicPrivate.PublicFlagEnum
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: private var PrivateMemberVar: Int32
|
|
// CHECK-NEXT: private static var PrivateStaticMemberVar: Int32
|
|
// CHECK-NEXT: private mutating func privateMemberFunc()
|
|
// CHECK-NEXT: private typealias PrivateTypedef = Int32
|
|
// CHECK-NEXT: private struct PrivateStruct {
|
|
// CHECK-NEXT: public init()
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: private struct PrivateEnum : Hashable, Equatable, RawRepresentable {
|
|
// CHECK-NEXT: private init(_ rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: private init(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: private var rawValue: [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: private typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: private static var PrivateEnumValue1: PublicPrivate.PrivateEnum { get }
|
|
// CHECK-NEXT: private static var PrivateAnonymousEnumValue1: Int { get }
|
|
// CHECK-NEXT: @frozen private enum PrivateClosedEnum : [[ENUM_UNDERLYING_TYPE]], @unchecked Sendable {
|
|
// CHECK-NEXT: private init?(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: private var rawValue: [[ENUM_UNDERLYING_TYPE]] { get }
|
|
// CHECK-NEXT: private typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: case value1
|
|
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "value1")
|
|
// CHECK-NEXT: private static var Value1: PublicPrivate.PrivateClosedEnum { get }
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: private enum PrivateOpenEnum : [[ENUM_UNDERLYING_TYPE]], @unchecked Sendable {
|
|
// CHECK-NEXT: private init?(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: private var rawValue: [[ENUM_UNDERLYING_TYPE]] { get }
|
|
// CHECK-NEXT: private typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: case value1
|
|
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "value1")
|
|
// CHECK-NEXT: private static var Value1: PublicPrivate.PrivateOpenEnum { get }
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: private struct PrivateFlagEnum : OptionSet, @unchecked Sendable {
|
|
// CHECK-NEXT: private init(rawValue: [[ENUM_UNDERLYING_TYPE]])
|
|
// CHECK-NEXT: private let rawValue: [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: private typealias RawValue = [[ENUM_UNDERLYING_TYPE]]
|
|
// CHECK-NEXT: private typealias Element = PublicPrivate.PrivateFlagEnum
|
|
// CHECK-NEXT: private typealias ArrayLiteralElement = PublicPrivate.PrivateFlagEnum
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: }
|