@@ -100,13 +100,16 @@ extension Span where Element: ~Copyable {
100100 _unsafeElements buffer: UnsafeBufferPointer < Element >
101101 ) {
102102 //FIXME: Workaround for https://github.com/swiftlang/swift/issues/77235
103- let baseAddress = buffer. baseAddress
103+ let baseAddress = UnsafeRawPointer ( buffer. baseAddress)
104104 _precondition (
105105 ( ( Int ( bitPattern: baseAddress) &
106106 ( MemoryLayout < Element > . alignment &- 1 ) ) == 0 ) ,
107107 " baseAddress must be properly aligned to access Element "
108108 )
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)
110113 }
111114
112115 /// Unsafely create a `Span` over initialized memory.
@@ -122,7 +125,11 @@ extension Span where Element: ~Copyable {
122125 public init (
123126 _unsafeElements buffer: UnsafeMutableBufferPointer < Element >
124127 ) {
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)
126133 }
127134
128135 /// Unsafely create a `Span` over initialized memory.
@@ -142,7 +149,11 @@ extension Span where Element: ~Copyable {
142149 count: Int
143150 ) {
144151 _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)
146157 }
147158}
148159
@@ -162,7 +173,11 @@ extension Span {
162173 public init (
163174 _unsafeElements buffer: borrowing Slice < UnsafeBufferPointer < Element > >
164175 ) {
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)
166181 }
167182
168183 /// Unsafely create a `Span` over initialized memory.
@@ -178,7 +193,11 @@ extension Span {
178193 public init (
179194 _unsafeElements buffer: borrowing Slice < UnsafeMutableBufferPointer < Element > >
180195 ) {
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)
182201 }
183202}
184203
@@ -214,7 +233,10 @@ extension Span where Element: BitwiseCopyable {
214233 _precondition (
215234 remainder == 0 , " Span must contain a whole number of elements "
216235 )
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)
218240 }
219241
220242 /// Unsafely create a `Span` over initialized memory.
@@ -234,7 +256,11 @@ extension Span where Element: BitwiseCopyable {
234256 public init (
235257 _unsafeBytes buffer: UnsafeMutableRawBufferPointer
236258 ) {
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)
238264 }
239265
240266 /// Unsafely create a `Span` over initialized memory.
@@ -258,7 +284,11 @@ extension Span where Element: BitwiseCopyable {
258284 byteCount: Int
259285 ) {
260286 _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)
262292 }
263293
264294 /// Unsafely create a `Span` over initialized memory.
@@ -278,7 +308,11 @@ extension Span where Element: BitwiseCopyable {
278308 public init (
279309 _unsafeBytes buffer: borrowing Slice < UnsafeRawBufferPointer >
280310 ) {
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)
282316 }
283317
284318 /// Unsafely create a `Span` over initialized memory.
@@ -298,7 +332,11 @@ extension Span where Element: BitwiseCopyable {
298332 public init (
299333 _unsafeBytes buffer: borrowing Slice < UnsafeMutableRawBufferPointer >
300334 ) {
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)
302340 }
303341
304342 /// Create a `Span` over the bytes represented by a `RawSpan`
@@ -309,9 +347,12 @@ extension Span where Element: BitwiseCopyable {
309347 @_alwaysEmitIntoClient
310348 @lifetime ( bytes)
311349 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)
315356 }
316357}
317358
@@ -481,7 +522,11 @@ extension Span where Element: ~Copyable {
481522 @lifetime ( self )
482523 public func _extracting( unchecked bounds: Range < Index > ) -> Self {
483524 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 )
485530 }
486531
487532 /// Constructs a new span over the items within the supplied range of
@@ -704,7 +749,10 @@ extension Span where Element: ~Copyable {
704749 let newCount = min ( maxLength, count)
705750 let offset = ( count &- newCount) * MemoryLayout< Element> . stride
706751 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 )
708756 }
709757
710758 /// Returns a span over all but the given number of initial elements.
@@ -728,6 +776,9 @@ extension Span where Element: ~Copyable {
728776 let droppedCount = min ( k, count)
729777 let offset = droppedCount * MemoryLayout< Element> . stride
730778 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 )
732783 }
733784}
0 commit comments