mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
1.8 KiB
87 lines
1.8 KiB
using System; |
|
|
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
|
{ |
|
internal class LifetimeTests |
|
{ |
|
private static int staticField; |
|
|
|
public Span<int> CreateWithoutCapture(scoped ref int value) |
|
{ |
|
// Okay: value is not captured |
|
return new Span<int>(ref staticField); |
|
} |
|
|
|
public Span<int> CreateAndCapture(ref int value) |
|
{ |
|
// Okay: value Rule 3 specifies that the safe-to-escape be limited to the ref-safe-to-escape |
|
// of the ref argument. That is the *calling method* for value hence this is not allowed. |
|
return new Span<int>(ref value); |
|
} |
|
|
|
public Span<int> ScopedRefSpan(scoped ref Span<int> span) |
|
{ |
|
return span; |
|
} |
|
|
|
public Span<int> ScopedSpan(scoped Span<int> span) |
|
{ |
|
return default(Span<int>); |
|
} |
|
|
|
public void OutSpan(out Span<int> span) |
|
{ |
|
span = default(Span<int>); |
|
} |
|
|
|
public void Calls() |
|
{ |
|
int value = 0; |
|
Span<int> span = CreateWithoutCapture(ref value); |
|
//span = CreateAndCapture(ref value); -- would need scoped local, not yet implemented |
|
span = ScopedRefSpan(ref span); |
|
span = ScopedSpan(span); |
|
OutSpan(out span); |
|
} |
|
} |
|
|
|
internal ref struct RefFields |
|
{ |
|
public ref int Field0; |
|
public ref readonly int Field1; |
|
public readonly ref int Field2; |
|
public readonly ref readonly int Field3; |
|
|
|
public int PropertyAccessingRefFieldByValue { |
|
get { |
|
return Field0; |
|
} |
|
set { |
|
Field0 = value; |
|
} |
|
} |
|
|
|
public ref int PropertyReturningRefFieldByReference => ref Field0; |
|
|
|
public void Uses(int[] array) |
|
{ |
|
Field1 = ref array[0]; |
|
Field2 = array[0]; |
|
} |
|
|
|
public void ReadonlyLocal() |
|
{ |
|
ref readonly int field = ref Field1; |
|
Console.WriteLine("No inlining"); |
|
field.ToString(); |
|
} |
|
|
|
public RefFields(ref int v) |
|
{ |
|
Field0 = ref v; |
|
Field1 = ref v; |
|
Field2 = ref v; |
|
Field3 = ref v; |
|
} |
|
} |
|
}
|
|
|