@@ -167,7 +167,8 @@ extension __ExpectationContext {
167167 ///
168168 /// This function helps overloads of `callAsFunction(_:_:)` disambiguate
169169 /// themselves and avoid accidental recursion.
170- @usableFromInline func captureValue< T> ( _ value: T , _ id: __ExpressionID ) -> T {
170+ @usableFromInline func captureValue< T> ( _ value: consuming T , _ id: __ExpressionID ) -> T {
171+ let value = copy value
171172 runtimeValues [ id] = { Expression . Value ( reflecting: value) }
172173 return value
173174 }
@@ -185,7 +186,7 @@ extension __ExpectationContext {
185186 /// - Warning: This function is used to implement the `#expect()` and
186187 /// `#require()` macros. Do not call it directly.
187188 @_disfavoredOverload
188- @inlinable public func callAsFunction< T> ( _ value: T , _ id: __ExpressionID ) -> T {
189+ @inlinable public func callAsFunction< T> ( _ value: consuming T , _ id: __ExpressionID ) -> T {
189190 captureValue ( value, id)
190191 }
191192
@@ -275,12 +276,14 @@ extension __ExpectationContext {
275276 @inlinable public func __cmp< T, U> (
276277 _ op: ( T , U ) throws -> Bool ,
277278 _ opID: __ExpressionID ,
278- _ lhs: T ,
279+ _ lhs: borrowing T ,
279280 _ lhsID: __ExpressionID ,
280- _ rhs: U ,
281+ _ rhs: borrowing U ,
281282 _ rhsID: __ExpressionID
282283 ) rethrows -> Bool {
283- try captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
284+ let lhs = copy lhs
285+ let rhs = copy rhs
286+ return try captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
284287 }
285288
286289 /// Compare two bidirectional collections using `==` or `!=`.
@@ -293,11 +296,13 @@ extension __ExpectationContext {
293296 public func __cmp< C> (
294297 _ op: ( C , C ) -> Bool ,
295298 _ opID: __ExpressionID ,
296- _ lhs: C ,
299+ _ lhs: borrowing C ,
297300 _ lhsID: __ExpressionID ,
298- _ rhs: C ,
301+ _ rhs: borrowing C ,
299302 _ rhsID: __ExpressionID
300303 ) -> Bool where C: BidirectionalCollection , C. Element: Equatable {
304+ let lhs = copy lhs
305+ let rhs = copy rhs
301306 let result = captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
302307
303308 if !result {
@@ -318,12 +323,14 @@ extension __ExpectationContext {
318323 @inlinable public func __cmp< R> (
319324 _ op: ( R , R ) -> Bool ,
320325 _ opID: __ExpressionID ,
321- _ lhs: R ,
326+ _ lhs: borrowing R ,
322327 _ lhsID: __ExpressionID ,
323- _ rhs: R ,
328+ _ rhs: borrowing R ,
324329 _ rhsID: __ExpressionID
325330 ) -> Bool where R: RangeExpression & BidirectionalCollection , R. Element: Equatable {
326- captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
331+ let lhs = copy lhs
332+ let rhs = copy rhs
333+ return captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
327334 }
328335
329336 /// Compare two strings using `==` or `!=`.
@@ -337,11 +344,13 @@ extension __ExpectationContext {
337344 public func __cmp< S> (
338345 _ op: ( S , S ) -> Bool ,
339346 _ opID: __ExpressionID ,
340- _ lhs: S ,
347+ _ lhs: borrowing S ,
341348 _ lhsID: __ExpressionID ,
342- _ rhs: S ,
349+ _ rhs: borrowing S ,
343350 _ rhsID: __ExpressionID
344351 ) -> Bool where S: StringProtocol {
352+ let lhs = copy lhs
353+ let rhs = copy rhs
345354 let result = captureValue ( op ( captureValue ( lhs, lhsID) , captureValue ( rhs, rhsID) ) , opID)
346355
347356 if !result {
@@ -392,7 +401,8 @@ extension __ExpectationContext {
392401 ///
393402 /// - Warning: This function is used to implement the `#expect()` and
394403 /// `#require()` macros. Do not call it directly.
395- @inlinable public func __as< T, U> ( _ value: T , _ valueID: __ExpressionID , _ type: U . Type , _ typeID: __ExpressionID ) -> U ? {
404+ @inlinable public func __as< T, U> ( _ value: consuming T , _ valueID: __ExpressionID , _ type: U . Type , _ typeID: __ExpressionID ) -> U ? {
405+ let value = copy value
396406 let result = captureValue ( value, valueID) as? U
397407
398408 if result == nil {
@@ -421,7 +431,8 @@ extension __ExpectationContext {
421431 ///
422432 /// - Warning: This function is used to implement the `#expect()` and
423433 /// `#require()` macros. Do not call it directly.
424- @inlinable public func __is< T, U> ( _ value: T , _ valueID: __ExpressionID , _ type: U . Type , _ typeID: __ExpressionID ) -> Bool {
434+ @inlinable public func __is< T, U> ( _ value: borrowing T , _ valueID: __ExpressionID , _ type: U . Type , _ typeID: __ExpressionID ) -> Bool {
435+ let value = copy value
425436 let result = captureValue ( value, valueID) is U
426437
427438 if !result {
0 commit comments