mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
If a non-member operator is declared in a C++ namespace, we previously imported it as a static member of the enum that represents the C++ namespace.
This is not always correct under Swift rules for operators. In pure Swift, this code is valid:
```
public protocol UnsafeCxxRandomAccessIterator {
static func +=(lhs: inout Self, rhs: Int)
}
enum std {
public struct A : UnsafeCxxRandomAccessIterator {
public static func += (lhs: inout A, rhs: Int) {
}
}
}
```
but this is not valid:
```
public protocol UnsafeCxxRandomAccessIterator {
static func +=(lhs: inout Self, rhs: Int)
}
enum std {
public struct A : UnsafeCxxRandomAccessIterator {}
public static func += (lhs: inout A, rhs: Int) {}
}
// error: Member operator '+=' must have at least one argument of type 'std'
```
This caused assertion failures in SILGen when conforming C++ iterator types to `UnsafeCxxRandomAccessIterator`.
41 lines
1.9 KiB
Swift
41 lines
1.9 KiB
Swift
// RUN: %target-swift-ide-test -print-module -module-to-print=FreeFunctions -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop | %FileCheck %s
|
|
|
|
// CHECK: enum FunctionsNS1 {
|
|
// CHECK-NEXT: static func basicFunctionTopLevel() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: static func forwardDeclared() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: static func definedOutOfLine() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: struct X {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: }
|
|
|
|
// FIXME: this seems wrong, the operator shouldn't be printed twice (https://github.com/apple/swift/issues/62727).
|
|
// CHECK-NEXT: func + (_: FunctionsNS1.X, _: FunctionsNS1.X) -> UnsafePointer<CChar>!
|
|
|
|
// CHECK-NEXT: enum FunctionsNS2 {
|
|
// CHECK-NEXT: enum FunctionsNS3 {
|
|
// CHECK-NEXT: struct Y {
|
|
// CHECK-NEXT: init()
|
|
// CHECK-NEXT: }
|
|
|
|
// FIXME: this seems wrong, the operator shouldn't be printed twice (https://github.com/apple/swift/issues/62727).
|
|
// CHECK-NEXT: func == (_: FunctionsNS1.FunctionsNS2.FunctionsNS3.Y, _: FunctionsNS1.FunctionsNS2.FunctionsNS3.Y) -> Bool
|
|
|
|
// CHECK-NEXT: static func basicFunctionLowestLevel() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: static func sameNameInChild() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: static func basicFunctionSecondLevel() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK-NEXT: static func sameNameInChild() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: static func sameNameInSibling() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: static func definedInDefs() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK-NEXT: func + (_: FunctionsNS1.X, _: FunctionsNS1.X) -> UnsafePointer<CChar>!
|
|
|
|
// CHECK-NEXT: enum FunctionsNS4 {
|
|
// CHECK-NEXT: static func sameNameInSibling() -> UnsafePointer<CChar>!
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK-NEXT: func == (_: FunctionsNS1.FunctionsNS2.FunctionsNS3.Y, _: FunctionsNS1.FunctionsNS2.FunctionsNS3.Y) -> Bool
|