mirror of
https://github.com/apple/swift.git
synced 2026-10-24 20:15:56 +02:00
The implementation for this behavior was added in a previous patch; this patch integrates and removes unused call sites. This patch also adds some tests exercising the overloading behavior. Annoyingly, imported members that point to the same source location aren't sorted correctly in the module interface, so this changes the order in a bunch of module interface tests. rdar://170857428 Also, un-comment broken test case of using Base::operator[], which is fixed by this commit. rdar://145345345
343 lines
14 KiB
Swift
343 lines
14 KiB
Swift
// RUN: %target-swift-ide-test -print-module -module-to-print=MemberInline -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default -Xcc -std=c++23 | %FileCheck %s
|
|
|
|
// CHECK: struct LoadableIntWrapper {
|
|
// CHECK: mutating func callAsFunction() -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
|
|
// CHECK: static func - (lhs: inout LoadableIntWrapper, rhs: LoadableIntWrapper) -> LoadableIntWrapper
|
|
// CHECK: static func += (lhs: inout LoadableIntWrapper, rhs: LoadableIntWrapper)
|
|
// CHECK: func successor() -> LoadableIntWrapper
|
|
// CHECK: }
|
|
// CHECK: func == (lhs: LoadableIntWrapper, rhs: LoadableIntWrapper) -> Bool
|
|
// CHECK: func -= (lhs: inout LoadableIntWrapper, rhs: LoadableIntWrapper)
|
|
|
|
// CHECK: func == (lhs: NS.IntWrapperInNamespace, rhs: NS.IntWrapperInNamespace) -> Bool
|
|
|
|
// CHECK: struct LoadableBoolWrapper
|
|
// CHECK: func __convertToBool() -> Bool
|
|
// CHECK: prefix static func ! (lhs: inout LoadableBoolWrapper) -> LoadableBoolWrapper
|
|
// CHECK: }
|
|
|
|
// CHECK: struct AddressOnlyIntWrapper {
|
|
// CHECK: mutating func callAsFunction() -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasPostIncrementOperator {
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasPreIncrementOperatorWithAnotherReturnType {
|
|
// CHECK: func successor() -> HasPreIncrementOperatorWithAnotherReturnType
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasPreIncrementOperatorWithVoidReturnType {
|
|
// CHECK: func successor() -> HasPreIncrementOperatorWithVoidReturnType
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasDeletedOperator {
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct ReadWriteIntArray {
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
|
|
|
|
// CHECK: subscript(x: Int32) -> Int32
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
|
|
|
|
// CHECK: struct NestedIntArray {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK-NEXT: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: subscript(x: Int32) -> Int32 { get }
|
|
// CHECK: }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct NullarySubscript {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst() -> Int32
|
|
// CHECK: subscript() -> Int32
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript() -> UnsafeMutablePointer<Int32>
|
|
// CHECK: }
|
|
|
|
// CHECK: struct BinarySubscript {
|
|
// CHECK: init(field: Int32)
|
|
// CHECK: init()
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32, _ y: Int32) -> Int32
|
|
// CHECK: subscript(x: Int32, y: Int32) -> Int32
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_: Int32, _: Int32) -> UnsafeMutablePointer<Int32>
|
|
// CHECK: var field: Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct ReadOnlyIntArray {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
|
|
// CHECK: subscript(x: Int32) -> Int32 { get }
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct WriteOnlyIntArray {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
|
|
// CHECK: subscript(x: Int32) -> Int32 { mutating get set }
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct DifferentTypesArray {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
|
|
// CHECK: subscript(x: Int32) -> Int32
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Bool) -> UnsafeMutablePointer<Bool>
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Bool) -> UnsafePointer<Bool>
|
|
// CHECK: subscript(x: Bool) -> Bool
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Double) -> UnsafePointer<Double>
|
|
// CHECK: subscript(x: Double) -> Double { get }
|
|
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct TemplatedArray<T> {
|
|
// CHECK: }
|
|
// CHECK: struct TemplatedArray<CDouble> {
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ i: Int32) -> UnsafeMutablePointer<Double>
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ i: Int32) -> UnsafePointer<Double>
|
|
// CHECK: subscript(i: Int32) -> Double
|
|
// CHECK: }
|
|
// CHECK: typealias TemplatedDoubleArray = TemplatedArray<CDouble>
|
|
|
|
|
|
// CHECK: struct TemplatedSubscriptArray {
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct IntArrayByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> Int32
|
|
// CHECK: subscript(x: Int32) -> Int32 { get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct NonTrivialIntArrayByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> Int32
|
|
// CHECK: subscript(x: Int32) -> Int32 { get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DifferentTypesArrayByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst(_ x: Int32) -> Int32
|
|
// CHECK: subscript(x: Int32) -> Int32 { mutating get }
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst(_ x: Bool) -> Bool
|
|
// CHECK: subscript(x: Bool) -> Bool { mutating get }
|
|
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Double) -> Double
|
|
// CHECK: subscript(x: Double) -> Double { get }
|
|
// CHECK: }
|
|
|
|
|
|
// CHECK: struct TemplatedArrayByVal<T> {
|
|
// CHECK: }
|
|
// CHECK: struct TemplatedArrayByVal<CDouble> {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst(_ i: Int32) -> Double
|
|
// CHECK: subscript(i: Int32) -> Double { mutating get }
|
|
// CHECK: }
|
|
// CHECK: typealias TemplatedDoubleArrayByVal = TemplatedArrayByVal<CDouble>
|
|
|
|
// CHECK: struct TemplatedByVal<T> {
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct TemplatedOperatorArrayByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst<T>(_ i: T) -> T
|
|
// CHECK: subscript<T>(i: T) -> T { mutating get }
|
|
// CHECK-NOT: mutating func __operatorPlus<T>(_ i: T) -> UnsafeMutablePointer<T>
|
|
// CHECK: }
|
|
|
|
// CHECK: struct NonTrivialArrayByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst(_ x: Int32) -> NonTrivial
|
|
// CHECK: subscript(x: Int32) -> NonTrivial { mutating get }
|
|
// CHECK: }
|
|
// CHECK: struct PtrByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>!
|
|
// CHECK: subscript(x: Int32) -> UnsafeMutablePointer<Int32>! { mutating get set }
|
|
// CHECK: }
|
|
// CHECK: struct RefToPtr {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<UnsafeMutablePointer<Int32>?>
|
|
// CHECK: subscript(x: Int32) -> UnsafeMutablePointer<Int32>? { mutating get set }
|
|
// CHECK: }
|
|
// CHECK: struct PtrToPtr {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<UnsafeMutablePointer<Int32>?>!
|
|
// CHECK: subscript(x: Int32) -> UnsafeMutablePointer<UnsafeMutablePointer<Int32>?>! { mutating get set }
|
|
// CHECK: }
|
|
// CHECK: struct ConstOpPtrByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>!
|
|
// CHECK: subscript(x: Int32) -> UnsafePointer<Int32>! { get }
|
|
// CHECK: }
|
|
// CHECK: struct ConstPtrByVal {
|
|
// CHECK: @available(*, unavailable, message: "use subscript")
|
|
// CHECK: mutating func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>!
|
|
// CHECK: subscript(x: Int32) -> UnsafePointer<Int32>! { mutating get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DerivedFromAddressOnlyIntWrapper {
|
|
// CHECK: mutating func callAsFunction() -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: mutating func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DerivedFromReadWriteIntArray {
|
|
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
|
|
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
|
|
// CHECK: subscript(x: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DerivedFromNonTrivialArrayByVal {
|
|
// CHECK: mutating func __operatorSubscriptConst(_ x: Int32) -> NonTrivial
|
|
// CHECK: subscript(x: Int32) -> NonTrivial { mutating get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct SubscriptUnnamedParameter {
|
|
// CHECK: subscript(__index0: Int32) -> Int32 { get }
|
|
// CHECK: }
|
|
// CHECK: struct SubscriptUnnamedParameterReadWrite {
|
|
// CHECK: subscript(__index0: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct Iterator {
|
|
// CHECK: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK: mutating func __operatorStar() -> UnsafeMutablePointer<Int32>
|
|
// CHECK: var pointee: Int32 { mutating get set }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct ConstIterator {
|
|
// CHECK: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK: var pointee: Int32 { get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct ConstIteratorByVal {
|
|
// CHECK: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK: func __operatorStar() -> Int32
|
|
// CHECK: var pointee: Int32 { get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct AllStar {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: var L: Int{{(32|64)?}}
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: mutating func __operatorStar() -> UnsafeMutablePointer<Int{{(32|64)?}}>
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use * instead")
|
|
// CHECK-NEXT: func __operatorStar(_ rhs: AllStar) -> AllStar
|
|
// CHECK-NEXT: static func * (lhs: AllStar, rhs: AllStar) -> AllStar
|
|
// CHECK-NEXT: var pointee: Int{{(32|64)?}} { mutating get set }
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct AmbiguousOperatorStar {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: var value: Int32
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: mutating func __operatorStar() -> UnsafeMutablePointer<Int32>
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: var pointee: Int32
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct AmbiguousOperatorStar2 {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: var value: Int32
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: mutating func __operatorStar() -> UnsafeMutablePointer<Int32>
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: var pointee: Int32
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct DerivedFromConstIterator {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: var pointee: Int32 { get }
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct DerivedFromConstIteratorPrivatelyWithUsingDecl {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: var pointee: Int32 { get }
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DerivedFromAmbiguousOperatorStarPrivatelyWithUsingDecl {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: mutating func __operatorStar() -> UnsafeMutablePointer<Int32>
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use .pointee property")
|
|
// CHECK-NEXT: func __operatorStar() -> UnsafePointer<Int32>
|
|
// CHECK-NEXT: var pointee: Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct DerivedFromLoadableIntWrapperWithUsingDecl {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use - instead")
|
|
// CHECK-NEXT: mutating func __operatorMinus(_ rhs: LoadableIntWrapper) -> LoadableIntWrapper
|
|
// CHECK-NEXT: @available(*, unavailable, message: "use += instead")
|
|
// CHECK-NEXT: mutating func __operatorPlusEqual(_ rhs: LoadableIntWrapper) -> LoadableIntWrapper
|
|
// CHECK-NEXT: func getValue() -> Int32
|
|
// CHECK-NEXT: mutating func setValue(_ v: Int32)
|
|
// CHECK-NEXT: static func - (lhs: inout DerivedFromLoadableIntWrapperWithUsingDecl, rhs: LoadableIntWrapper) -> LoadableIntWrapper
|
|
// CHECK-NEXT: static func += (lhs: inout DerivedFromLoadableIntWrapperWithUsingDecl, rhs: LoadableIntWrapper) -> LoadableIntWrapper
|
|
// CHECK-NEXT: func successor() -> DerivedFromLoadableIntWrapperWithUsingDecl
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasOperatorCallWithDefaultArg {
|
|
// CHECK: func callAsFunction(_ x: Int32 = cxxDefaultArg) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasStaticOperatorCallBase {
|
|
// CHECK: func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasStaticOperatorCallDerived {
|
|
// CHECK: func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasStaticOperatorCallWithConstOperator {
|
|
// CHECK: func callAsFunction(_ x: Int32) -> Int32
|
|
// CHECK: func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
|
|
// CHECK: }
|
|
|
|
// CHECK: struct HasStaticOperatorCallWithUnimportableCxxType {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: struct HasOperatorReturningAuto {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: }
|
|
|