@@ -100,13 +100,16 @@ extension Span where Element: ~Copyable {
100
100
_unsafeElements buffer: UnsafeBufferPointer < Element >
101
101
) {
102
102
//FIXME: Workaround for https://github.com/swiftlang/swift/issues/77235
103
- let baseAddress = buffer. baseAddress
103
+ let baseAddress = UnsafeRawPointer ( buffer. baseAddress)
104
104
_precondition (
105
105
( ( Int ( bitPattern: baseAddress) &
106
106
( MemoryLayout < Element > . alignment &- 1 ) ) == 0 ) ,
107
107
" baseAddress must be properly aligned to access Element "
108
108
)
109
- self . init ( _unchecked: baseAddress, count: buffer. count)
109
+ let span = Span ( _unchecked: baseAddress, count: buffer. count)
110
+ // As a trivial value, 'baseAddress' does not formally depend on the
111
+ // lifetime of 'buffer'. Make the dependence explicit.
112
+ self = _overrideLifetime ( span, borrowing: buffer)
110
113
}
111
114
112
115
/// Unsafely create a `Span` over initialized memory.
@@ -122,7 +125,11 @@ extension Span where Element: ~Copyable {
122
125
public init (
123
126
_unsafeElements buffer: UnsafeMutableBufferPointer < Element >
124
127
) {
125
- self . init ( _unsafeElements: UnsafeBufferPointer ( buffer) )
128
+ let buf = UnsafeBufferPointer ( buffer)
129
+ let span = Span ( _unsafeElements: buf)
130
+ // As a trivial value, 'buf' does not formally depend on the
131
+ // lifetime of 'buffer'. Make the dependence explicit.
132
+ self = _overrideLifetime ( span, borrowing: buffer)
126
133
}
127
134
128
135
/// Unsafely create a `Span` over initialized memory.
@@ -142,7 +149,11 @@ extension Span where Element: ~Copyable {
142
149
count: Int
143
150
) {
144
151
_precondition ( count >= 0 , " Count must not be negative " )
145
- self . init ( _unsafeElements: . init( start: pointer, count: count) )
152
+ let buf = UnsafeBufferPointer ( start: pointer, count: count)
153
+ let span = Span ( _unsafeElements: buf)
154
+ // As a trivial value, 'buf' does not formally depend on the
155
+ // lifetime of 'pointer'. Make the dependence explicit.
156
+ self = _overrideLifetime ( span, borrowing: pointer)
146
157
}
147
158
}
148
159
@@ -162,7 +173,11 @@ extension Span {
162
173
public init (
163
174
_unsafeElements buffer: borrowing Slice < UnsafeBufferPointer < Element > >
164
175
) {
165
- self . init ( _unsafeElements: UnsafeBufferPointer ( rebasing: buffer) )
176
+ let buf = UnsafeBufferPointer ( rebasing: buffer)
177
+ let span = Span ( _unsafeElements: buf)
178
+ // As a trivial value, 'buf' does not formally depend on the
179
+ // lifetime of 'buffer'. Make the dependence explicit.
180
+ self = _overrideLifetime ( span, borrowing: buffer)
166
181
}
167
182
168
183
/// Unsafely create a `Span` over initialized memory.
@@ -178,7 +193,11 @@ extension Span {
178
193
public init (
179
194
_unsafeElements buffer: borrowing Slice < UnsafeMutableBufferPointer < Element > >
180
195
) {
181
- self . init ( _unsafeElements: UnsafeBufferPointer ( rebasing: buffer) )
196
+ let buf = UnsafeBufferPointer ( rebasing: buffer)
197
+ let span = Span ( _unsafeElements: buf)
198
+ // As a trivial value, 'buf' does not formally depend on the
199
+ // lifetime of 'buffer'. Make the dependence explicit.
200
+ self = _overrideLifetime ( span, borrowing: buffer)
182
201
}
183
202
}
184
203
@@ -214,7 +233,10 @@ extension Span where Element: BitwiseCopyable {
214
233
_precondition (
215
234
remainder == 0 , " Span must contain a whole number of elements "
216
235
)
217
- self . init ( _unchecked: baseAddress, count: count)
236
+ let span = Span ( _unchecked: baseAddress, count: count)
237
+ // As a trivial value, 'baseAddress' does not formally depend on the
238
+ // lifetime of 'buffer'. Make the dependence explicit.
239
+ self = _overrideLifetime ( span, borrowing: buffer)
218
240
}
219
241
220
242
/// Unsafely create a `Span` over initialized memory.
@@ -234,7 +256,11 @@ extension Span where Element: BitwiseCopyable {
234
256
public init (
235
257
_unsafeBytes buffer: UnsafeMutableRawBufferPointer
236
258
) {
237
- self . init ( _unsafeBytes: UnsafeRawBufferPointer ( buffer) )
259
+ let rawBuffer = UnsafeRawBufferPointer ( buffer)
260
+ let span = Span ( _unsafeBytes: rawBuffer)
261
+ // As a trivial value, 'buf' does not formally depend on the
262
+ // lifetime of 'buffer'. Make the dependence explicit.
263
+ self = _overrideLifetime ( span, borrowing: buffer)
238
264
}
239
265
240
266
/// Unsafely create a `Span` over initialized memory.
@@ -258,7 +284,11 @@ extension Span where Element: BitwiseCopyable {
258
284
byteCount: Int
259
285
) {
260
286
_precondition ( byteCount >= 0 , " Count must not be negative " )
261
- self . init ( _unsafeBytes: . init( start: pointer, count: byteCount) )
287
+ let rawBuffer = UnsafeRawBufferPointer ( start: pointer, count: byteCount)
288
+ let span = Span ( _unsafeBytes: rawBuffer)
289
+ // As a trivial value, 'rawBuffer' does not formally depend on the
290
+ // lifetime of 'pointer'. Make the dependence explicit.
291
+ self = _overrideLifetime ( span, borrowing: pointer)
262
292
}
263
293
264
294
/// Unsafely create a `Span` over initialized memory.
@@ -278,7 +308,11 @@ extension Span where Element: BitwiseCopyable {
278
308
public init (
279
309
_unsafeBytes buffer: borrowing Slice < UnsafeRawBufferPointer >
280
310
) {
281
- self . init ( _unsafeBytes: UnsafeRawBufferPointer ( rebasing: buffer) )
311
+ let rawBuffer = UnsafeRawBufferPointer ( rebasing: buffer)
312
+ let span = Span ( _unsafeBytes: rawBuffer)
313
+ // As a trivial value, 'rawBuffer' does not formally depend on the
314
+ // lifetime of 'buffer'. Make the dependence explicit.
315
+ self = _overrideLifetime ( span, borrowing: buffer)
282
316
}
283
317
284
318
/// Unsafely create a `Span` over initialized memory.
@@ -298,7 +332,11 @@ extension Span where Element: BitwiseCopyable {
298
332
public init (
299
333
_unsafeBytes buffer: borrowing Slice < UnsafeMutableRawBufferPointer >
300
334
) {
301
- self . init ( _unsafeBytes: UnsafeRawBufferPointer ( rebasing: buffer) )
335
+ let rawBuffer = UnsafeRawBufferPointer ( rebasing: buffer)
336
+ let span = Span ( _unsafeBytes: rawBuffer)
337
+ // As a trivial value, 'rawBuffer' does not formally depend on the
338
+ // lifetime of 'buffer'. Make the dependence explicit.
339
+ self = _overrideLifetime ( span, borrowing: buffer)
302
340
}
303
341
304
342
/// Create a `Span` over the bytes represented by a `RawSpan`
@@ -309,9 +347,12 @@ extension Span where Element: BitwiseCopyable {
309
347
@_alwaysEmitIntoClient
310
348
@lifetime ( bytes)
311
349
public init ( _bytes bytes: consuming RawSpan ) {
312
- self . init (
313
- _unsafeBytes: . init( start: bytes. _pointer, count: bytes. byteCount)
314
- )
350
+ let rawBuffer =
351
+ UnsafeRawBufferPointer ( start: bytes. _pointer, count: bytes. byteCount)
352
+ let span = Span ( _unsafeBytes: rawBuffer)
353
+ // As a trivial value, 'rawBuffer' does not formally depend on the
354
+ // lifetime of 'bytes'. Make the dependence explicit.
355
+ self = _overrideLifetime ( span, copying: bytes)
315
356
}
316
357
}
317
358
@@ -481,7 +522,11 @@ extension Span where Element: ~Copyable {
481
522
@lifetime ( self )
482
523
public func _extracting( unchecked bounds: Range < Index > ) -> Self {
483
524
let delta = bounds. lowerBound &* MemoryLayout< Element> . stride
484
- return Span ( _unchecked: _pointer? . advanced ( by: delta) , count: bounds. count)
525
+ let newStart = _pointer? . advanced ( by: delta)
526
+ let newSpan = Span ( _unchecked: newStart, count: bounds. count)
527
+ // As a trivial value, 'newStart' does not formally depend on the
528
+ // lifetime of 'self'. Make the dependence explicit.
529
+ return _overrideLifetime ( newSpan, copying: self )
485
530
}
486
531
487
532
/// Constructs a new span over the items within the supplied range of
@@ -704,7 +749,10 @@ extension Span where Element: ~Copyable {
704
749
let newCount = min ( maxLength, count)
705
750
let offset = ( count &- newCount) * MemoryLayout< Element> . stride
706
751
let newStart = _pointer? . advanced ( by: offset)
707
- return Self ( _unchecked: newStart, count: newCount)
752
+ let newSpan = Span ( _unchecked: newStart, count: newCount)
753
+ // As a trivial value, 'newStart' does not formally depend on the
754
+ // lifetime of 'buffer'. Make the dependence explicit.
755
+ return _overrideLifetime ( newSpan, copying: self )
708
756
}
709
757
710
758
/// Returns a span over all but the given number of initial elements.
@@ -728,6 +776,9 @@ extension Span where Element: ~Copyable {
728
776
let droppedCount = min ( k, count)
729
777
let offset = droppedCount * MemoryLayout< Element> . stride
730
778
let newStart = _pointer? . advanced ( by: offset)
731
- return Self ( _unchecked: newStart, count: count &- droppedCount)
779
+ let newSpan = Span ( _unchecked: newStart, count: count &- droppedCount)
780
+ // As a trivial value, 'newStart' does not formally depend on the
781
+ // lifetime of 'buffer'. Make the dependence explicit.
782
+ return _overrideLifetime ( newSpan, copying: self )
732
783
}
733
784
}
0 commit comments