@@ -32,6 +32,27 @@ struct X {
32
32
func myFunc5( ) -> SpanOfInt { }
33
33
}
34
34
35
+ @_SwiftifyImport ( . lifetimeDependence( dependsOn: . param( 1 ) , pointer: . return, type: . copy) ,
36
+ . sizedBy( pointer: . param( 2 ) , size: " count * size " ) ,
37
+ . nonescaping( pointer: . param( 2 ) ) ,
38
+ typeMappings: [ " SpanOfInt " : " std.span<CInt> " ] )
39
+ func myFunc6( _ span: SpanOfInt , _ ptr: UnsafeRawPointer , _ count: CInt , _ size: CInt ) -> SpanOfInt {
40
+ }
41
+
42
+ @_SwiftifyImport ( . sizedBy( pointer: . param( 2 ) , size: " count * size " ) ,
43
+ . lifetimeDependence( dependsOn: . param( 1 ) , pointer: . return, type: . copy) ,
44
+ . nonescaping( pointer: . param( 2 ) ) ,
45
+ typeMappings: [ " SpanOfInt " : " std.span<CInt> " ] )
46
+ func myFunc7( _ span: SpanOfInt , _ ptr: UnsafeRawPointer , _ count: CInt , _ size: CInt ) -> SpanOfInt {
47
+ }
48
+
49
+ @_SwiftifyImport ( . sizedBy( pointer: . param( 1 ) , size: " count * size " ) ,
50
+ . nonescaping( pointer: . param( 1 ) ) ,
51
+ . lifetimeDependence( dependsOn: . param( 2 ) , pointer: . return, type: . copy) ,
52
+ typeMappings: [ " SpanOfInt " : " std.span<CInt> " ] )
53
+ func myFunc8( _ ptr: UnsafeRawPointer , _ span: SpanOfInt , _ count: CInt , _ size: CInt ) -> SpanOfInt {
54
+ }
55
+
35
56
// CHECK: @_alwaysEmitIntoClient @lifetime(copy span)
36
57
// CHECK-NEXT: func myFunc(_ span: Span<CInt>) -> Span<CInt> {
37
58
// CHECK-NEXT: return unsafe _cxxOverrideLifetime(Span(_unsafeCxxSpan: myFunc(SpanOfInt(span))), copying: ())
@@ -56,3 +77,36 @@ struct X {
56
77
// CHECK-NEXT: func myFunc5() -> Span<CInt> {
57
78
// CHECK-NEXT: return unsafe _cxxOverrideLifetime(Span(_unsafeCxxSpan: myFunc5()), copying: ())
58
79
// CHECK-NEXT: }
80
+
81
+ // CHECK: @_alwaysEmitIntoClient @lifetime(copy span)
82
+ // CHECK-NEXT: func myFunc6(_ span: Span<CInt>, _ ptr: RawSpan, _ count: CInt, _ size: CInt) -> Span<CInt> {
83
+ // CHECK-NEXT: let _ptrCount: some BinaryInteger = count * size
84
+ // CHECK-NEXT: if ptr.byteCount < _ptrCount || _ptrCount < 0 {
85
+ // CHECK-NEXT: fatalError("bounds check failure when calling unsafe function")
86
+ // CHECK-NEXT: }
87
+ // CHECK-NEXT: return unsafe _cxxOverrideLifetime(Span(_unsafeCxxSpan: ptr.withUnsafeBytes { _ptrPtr in
88
+ // CHECK-NEXT: return unsafe myFunc6(SpanOfInt(span), _ptrPtr.baseAddress!, count, size)
89
+ // CHECK-NEXT: }), copying: ())
90
+ // CHECK-NEXT: }
91
+
92
+ // CHECK: @_alwaysEmitIntoClient @lifetime(copy span)
93
+ // CHECK-NEXT: func myFunc7(_ span: Span<CInt>, _ ptr: RawSpan, _ count: CInt, _ size: CInt) -> Span<CInt> {
94
+ // CHECK-NEXT: let _ptrCount: some BinaryInteger = count * size
95
+ // CHECK-NEXT: if ptr.byteCount < _ptrCount || _ptrCount < 0 {
96
+ // CHECK-NEXT: fatalError("bounds check failure when calling unsafe function")
97
+ // CHECK-NEXT: }
98
+ // CHECK-NEXT: return unsafe _cxxOverrideLifetime(Span(_unsafeCxxSpan: ptr.withUnsafeBytes { _ptrPtr in
99
+ // CHECK-NEXT: return unsafe myFunc7(SpanOfInt(span), _ptrPtr.baseAddress!, count, size)
100
+ // CHECK-NEXT: }), copying: ())
101
+ // CHECK-NEXT: }
102
+
103
+ // CHECK: @_alwaysEmitIntoClient @lifetime(copy span)
104
+ // CHECK-NEXT: func myFunc8(_ ptr: RawSpan, _ span: Span<CInt>, _ count: CInt, _ size: CInt) -> Span<CInt> {
105
+ // CHECK-NEXT: let _ptrCount: some BinaryInteger = count * size
106
+ // CHECK-NEXT: if ptr.byteCount < _ptrCount || _ptrCount < 0 {
107
+ // CHECK-NEXT: fatalError("bounds check failure when calling unsafe function")
108
+ // CHECK-NEXT: }
109
+ // CHECK-NEXT: return unsafe _cxxOverrideLifetime(Span(_unsafeCxxSpan: ptr.withUnsafeBytes { _ptrPtr in
110
+ // CHECK-NEXT: return unsafe myFunc8(_ptrPtr.baseAddress!, SpanOfInt(span), count, size)
111
+ // CHECK-NEXT: }), copying: ())
112
+ // CHECK-NEXT: }
0 commit comments