@@ -221,6 +221,21 @@ public unsafe void By_ref_like_arguments_can_be_restored_from_ByRefLikeArgument_
221221 Assert. AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
222222 }
223223
224+ #if FEATURE_ALLOWS_REF_STRUCT_ANTI_CONSTRAINT
225+ [ Test ]
226+ public void By_ref_like_arguments_can_be_restored_from_ByRefLikeArgument_Get_in_invocation ( )
227+ {
228+ var interceptor = new ObservingInterceptor ( ) ;
229+ var proxy = generator . CreateClassProxy < HasMethodWithSpanParameter > ( interceptor ) ;
230+ var arg = "original" . AsSpan ( ) ;
231+ proxy . Method ( arg ) ;
232+ Assume . That ( interceptor . ObservedArg is ByRefLikeArgument < ReadOnlySpan < char > > ) ;
233+ var wrappedArg = ( ByRefLikeArgument < ReadOnlySpan < char > > ) interceptor . ObservedArg ! ;
234+ var unwrappedArg = wrappedArg . Get ( ) ;
235+ Assert . AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
236+ }
237+ #endif
238+
224239 [ Test ]
225240 public void By_ref_like_in_arguments_are_wrapped_as_ByRefLikeArgument_in_invocation ( )
226241 {
@@ -244,6 +259,21 @@ public unsafe void By_ref_like_in_arguments_can_be_restored_from_ByRefLikeArgume
244259 Assert. AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
245260 }
246261
262+ #if FEATURE_ALLOWS_REF_STRUCT_ANTI_CONSTRAINT
263+ [ Test ]
264+ public void By_ref_like_in_arguments_can_be_restored_from_ByRefLikeArgument_Get_in_invocation ( )
265+ {
266+ var interceptor = new ObservingInterceptor ( ) ;
267+ var proxy = generator . CreateClassProxy < HasMethodWithSpanInParameter > ( interceptor ) ;
268+ var arg = "original" . AsSpan ( ) ;
269+ proxy . Method ( in arg ) ;
270+ Assume . That ( interceptor . ObservedArg is ByRefLikeArgument < ReadOnlySpan < char > > ) ;
271+ var wrappedArg = ( ByRefLikeArgument < ReadOnlySpan < char > > ) interceptor . ObservedArg ! ;
272+ var unwrappedArg = wrappedArg . Get ( ) ;
273+ Assert . AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
274+ }
275+ #endif
276+
247277 [ Test ]
248278 public void By_ref_like_ref_arguments_are_wrapped_as_ByRefLikeArgument_in_invocation ( )
249279 {
@@ -267,6 +297,21 @@ public unsafe void By_ref_like_ref_arguments_can_be_restored_from_ByRefLikeArgum
267297 Assert. AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
268298 }
269299
300+ #if FEATURE_ALLOWS_REF_STRUCT_ANTI_CONSTRAINT
301+ [ Test ]
302+ public void By_ref_like_ref_arguments_can_be_restored_from_ByRefLikeArgument_Get_in_invocation ( )
303+ {
304+ var interceptor = new ObservingInterceptor ( ) ;
305+ var proxy = generator . CreateClassProxy < HasMethodWithSpanRefParameter > ( interceptor ) ;
306+ var arg = "original" . AsSpan ( ) ;
307+ proxy . Method ( ref arg ) ;
308+ Assume . That ( interceptor . ObservedArg is ByRefLikeArgument < ReadOnlySpan < char > > ) ;
309+ var wrappedArg = ( ByRefLikeArgument < ReadOnlySpan < char > > ) interceptor . ObservedArg ! ;
310+ var unwrappedArg = wrappedArg . Get ( ) ;
311+ Assert . AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
312+ }
313+ #endif
314+
270315 // Note the somewhat weird semantics of this test: DynamicProxy allows you to read the incoming values
271316 // of `out` arguments, which would be illegal in plain C# ("use of unassigned out parameter").
272317 // DynamicProxy does not distinguish between `ref` and `out` in this regard.
@@ -295,6 +340,23 @@ public unsafe void By_ref_like_out_arguments_can_be_restored_from_ByRefLikeArgum
295340 Assert. AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
296341 }
297342
343+ #if FEATURE_ALLOWS_REF_STRUCT_ANTI_CONSTRAINT
344+ // Should theoretically be as above (read comment there), but isn't. To be revisited later!
345+ [ Test ]
346+ [ Ignore ( "Have not yet found out why byref-like `out` arguments are initially set to their default values unlike `ref` ones." ) ]
347+ public void By_ref_like_out_arguments_can_be_restored_from_ByRefLikeArgument_Get_in_invocation ( )
348+ {
349+ var interceptor = new ObservingInterceptor ( ) ;
350+ var proxy = generator . CreateClassProxy < HasMethodWithSpanOutParameter > ( interceptor ) ;
351+ var arg = "original" . AsSpan ( ) ;
352+ proxy . Method ( out arg ) ;
353+ Assume . That ( interceptor . ObservedArg is ByRefLikeArgument < ReadOnlySpan < char > > ) ;
354+ var wrappedArg = ( ByRefLikeArgument < ReadOnlySpan < char > > ) interceptor . ObservedArg ! ;
355+ var unwrappedArg = wrappedArg . Get ( ) ;
356+ Assert . AreEqual ( "original" , unwrappedArg . ToString ( ) ) ;
357+ }
358+ #endif
359+
298360 #endregion
299361
300362 #region What values do proceeded-to targets see for by-ref-like arguments?
0 commit comments