Skip to content

Commit 42c245e

Browse files
authored
Merge pull request #106649 from dotnet/merge/release/9.0-rc1-to-release/9.0
[automated] Merge branch 'release/9.0-rc1' => 'release/9.0'
2 parents 623b402 + d89cc99 commit 42c245e

File tree

28 files changed

+231
-69
lines changed

28 files changed

+231
-69
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: Inter-branch merge workflow
2+
on:
3+
push:
4+
branches:
5+
- release/**
6+
7+
permissions:
8+
contents: write
9+
pull-requests: write
10+
11+
jobs:
12+
Merge:
13+
uses: dotnet/arcade/.github/workflows/inter-branch-merge-base.yml@main

eng/Version.Details.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@
6464
<Sha>ed276e79e30bffc3e6405afa8a9323ec7e67c700</Sha>
6565
<SourceBuild RepoName="cecil" ManagedOnly="true" />
6666
</Dependency>
67-
<Dependency Name="Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport" Version="10.0.0-alpha.1.24415.4">
67+
<Dependency Name="Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport" Version="9.0.0-rc.1.24416.2">
6868
<Uri>https://github.com/dotnet/emsdk</Uri>
69-
<Sha>6c91507683fd47c500956743cc93750aba4da54d</Sha>
69+
<Sha>459c92904b224d125a350a3f3e431fe90152a95e</Sha>
7070
</Dependency>
7171
<!-- Intermediate is necessary for source build. -->
72-
<Dependency Name="Microsoft.SourceBuild.Intermediate.emsdk" Version="10.0.0-alpha.1.24415.4">
72+
<Dependency Name="Microsoft.SourceBuild.Intermediate.emsdk" Version="9.0.0-rc.1.24416.2">
7373
<Uri>https://github.com/dotnet/emsdk</Uri>
74-
<Sha>6c91507683fd47c500956743cc93750aba4da54d</Sha>
74+
<Sha>459c92904b224d125a350a3f3e431fe90152a95e</Sha>
7575
<SourceBuild RepoName="emsdk" ManagedOnly="true" />
7676
</Dependency>
7777
<!-- Intermediate is necessary for source build. -->

eng/Versions.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<MinorVersion>0</MinorVersion>
88
<PatchVersion>0</PatchVersion>
99
<SdkBandVersion>9.0.100</SdkBandVersion>
10-
<PackageVersionNet8>8.0.7</PackageVersionNet8>
10+
<PackageVersionNet8>8.0.9</PackageVersionNet8>
1111
<PackageVersionNet7>7.0.20</PackageVersionNet7>
1212
<PackageVersionNet6>6.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet8)').Build),25))</PackageVersionNet6>
1313
<PreReleaseVersionLabel>rc</PreReleaseVersionLabel>
@@ -239,7 +239,7 @@
239239
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
240240
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-9_0_100_Transport
241241
-->
242-
<MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>10.0.0-alpha.1.24415.4</MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>
242+
<MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>9.0.0-rc.1.24416.2</MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>
243243
<MicrosoftNETRuntimeEmscriptenVersion>$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion)</MicrosoftNETRuntimeEmscriptenVersion>
244244
<!-- workloads -->
245245
<SwixPackageVersion>1.1.87-gba258badda</SwixPackageVersion>

eng/packaging.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<PackageDesignerMarkerFile>$(MSBuildThisFileDirectory)useSharedDesignerContext.txt</PackageDesignerMarkerFile>
2323

2424
<!-- PackageReadmeFile specifies the package readme file name in the package. PackageReadmeFilePath points to the package readme file on disk. -->
25+
<EnableDefaultPackageReadmeFile Condition="'$(EnableDefaultPackageReadmeFile)' == '' and '$(IsShipping)' == 'true'">true</EnableDefaultPackageReadmeFile>
2526
<PackageReadmeFile Condition="'$(PackageReadmeFile)' == '' and '$(EnableDefaultPackageReadmeFile)' == 'true'">PACKAGE.md</PackageReadmeFile>
2627
<PackageReadmeFilePath Condition="'$(PackageReadmeFilePath)' == '' and '$(EnableDefaultPackageReadmeFile)' == 'true'">PACKAGE.md</PackageReadmeFilePath>
2728
<BeforePack>$(BeforePack);ValidatePackageReadmeExists</BeforePack>

eng/pipelines/runtime-official.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ extends:
4141
# Localization build
4242
#
4343

44-
- template: /eng/common/templates-official/job/onelocbuild.yml
45-
parameters:
46-
MirrorRepo: runtime
47-
MirrorBranch: main
48-
LclSource: lclFilesfromPackage
49-
LclPackageId: 'LCL-JUNO-PROD-RUNTIME'
44+
- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/release/9.0') }}:
45+
- template: /eng/common/templates-official/job/onelocbuild.yml
46+
parameters:
47+
MirrorRepo: runtime
48+
MirrorBranch: release/9.0
49+
LclSource: lclFilesfromPackage
50+
LclPackageId: 'LCL-JUNO-PROD-RUNTIME'
5051

5152
#
5253
# Source Index Build

src/coreclr/inc/clrnt.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,24 @@ RtlVirtualUnwind(
369369
IN OUT PKNONVOLATILE_CONTEXT_POINTERS ContextPointers OPTIONAL
370370
);
371371

372+
// Mirror the XSTATE_ARM64_SVE flags from winnt.h
373+
374+
#ifndef XSTATE_ARM64_SVE
375+
#define XSTATE_ARM64_SVE (2)
376+
#endif // XSTATE_ARM64_SVE
377+
378+
#ifndef XSTATE_MASK_ARM64_SVE
379+
#define XSTATE_MASK_ARM64_SVE (1ui64 << (XSTATE_ARM64_SVE))
380+
#endif // XSTATE_MASK_ARM64_SVE
381+
382+
#ifndef CONTEXT_ARM64_XSTATE
383+
#define CONTEXT_ARM64_XSTATE (CONTEXT_ARM64 | 0x20L)
384+
#endif // CONTEXT_ARM64_XSTATE
385+
386+
#ifndef CONTEXT_XSTATE
387+
#define CONTEXT_XSTATE CONTEXT_ARM64_XSTATE
388+
#endif // CONTEXT_XSTATE
389+
372390
#endif
373391

374392
#ifdef TARGET_LOONGARCH64

src/coreclr/jit/lowerxarch.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,10 +1430,9 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
14301430
const uint8_t B = 0xCC;
14311431
const uint8_t C = 0xAA;
14321432

1433-
var_types simdType = node->TypeGet();
1434-
CorInfoType simdBaseJitType = node->GetSimdBaseJitType();
1435-
var_types simdBaseType = node->GetSimdBaseType();
1436-
unsigned simdSize = node->GetSimdSize();
1433+
var_types simdType = node->TypeGet();
1434+
var_types simdBaseType = node->GetSimdBaseType();
1435+
unsigned simdSize = node->GetSimdSize();
14371436

14381437
GenTree* op1 = node->Op(1);
14391438
GenTree* op2 = node->Op(2);
@@ -1455,6 +1454,10 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
14551454
bool userIsScalar = false;
14561455
genTreeOps userOper = userIntrin->GetOperForHWIntrinsicId(&isScalar);
14571456

1457+
// userIntrin may have re-interpreted the base type
1458+
//
1459+
simdBaseType = userIntrin->GetSimdBaseType();
1460+
14581461
if (GenTreeHWIntrinsic::OperIsBitwiseHWIntrinsic(userOper))
14591462
{
14601463
if (isOperNot && (userOper == GT_AND))
@@ -3924,6 +3927,13 @@ GenTree* Lowering::LowerHWIntrinsicTernaryLogic(GenTreeHWIntrinsic* node)
39243927
}
39253928
}
39263929

3930+
// Update the locals to reflect any operand swaps we did above.
3931+
3932+
op1 = node->Op(1);
3933+
op2 = node->Op(2);
3934+
op3 = node->Op(3);
3935+
assert(op4 == node->Op(4));
3936+
39273937
GenTree* replacementNode = nullptr;
39283938

39293939
switch (useFlags)

src/coreclr/jit/optimizebools.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,6 @@ void OptBoolsDsc::optOptimizeBoolsUpdateTrees()
13271327
assert(m_b2->KindIs(BBJ_COND));
13281328
assert(m_b1->TrueTargetIs(m_b2->GetTrueTarget()));
13291329
assert(m_b1->FalseTargetIs(m_b2));
1330-
assert(!m_b2->IsLast());
13311330

13321331
// We now reach B2's false target via B1 false.
13331332
//

src/coreclr/vm/amd64/cgenamd64.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ void FaultingExceptionFrame::UpdateRegDisplay(const PREGDISPLAY pRD, bool update
231231

232232
memcpy(pRD->pCurrentContext, &m_ctx, sizeof(CONTEXT));
233233

234+
// Clear the CONTEXT_XSTATE, since the REGDISPLAY contains just plain CONTEXT structure
235+
// that cannot contain any extended state.
236+
pRD->pCurrentContext->ContextFlags &= ~(CONTEXT_XSTATE & CONTEXT_AREA_MASK);
237+
234238
pRD->ControlPC = m_ctx.Rip;
235239

236240
pRD->SP = m_ctx.Rsp;

src/coreclr/vm/arm64/stubs.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,10 @@ void FaultingExceptionFrame::UpdateRegDisplay(const PREGDISPLAY pRD, bool update
635635
// Copy the context to regdisplay
636636
memcpy(pRD->pCurrentContext, &m_ctx, sizeof(T_CONTEXT));
637637

638+
// Clear the CONTEXT_XSTATE, since the REGDISPLAY contains just plain CONTEXT structure
639+
// that cannot contain any extended state.
640+
pRD->pCurrentContext->ContextFlags &= ~(CONTEXT_XSTATE & CONTEXT_AREA_MASK);
641+
638642
pRD->ControlPC = ::GetIP(&m_ctx);
639643
pRD->SP = ::GetSP(&m_ctx);
640644

src/coreclr/vm/i386/cgenx86.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,10 @@ void FaultingExceptionFrame::UpdateRegDisplay(const PREGDISPLAY pRD, bool update
478478

479479
memcpy(pRD->pCurrentContext, &m_ctx, sizeof(CONTEXT));
480480

481+
// Clear the CONTEXT_XSTATE, since the REGDISPLAY contains just plain CONTEXT structure
482+
// that cannot contain any extended state.
483+
pRD->pCurrentContext->ContextFlags &= ~(CONTEXT_XSTATE & CONTEXT_AREA_MASK);
484+
481485
pRD->SP = m_ctx.Esp;
482486
pRD->ControlPC = m_ctx.Eip;
483487

src/coreclr/vm/threadsuspend.cpp

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,6 @@ ThreadSuspend::SUSPEND_REASON ThreadSuspend::m_suspendReason;
2828
void* ThreadSuspend::g_returnAddressHijackTarget = NULL;
2929
#endif // TARGET_WINDOWS
3030

31-
#if defined(TARGET_ARM64)
32-
// Mirror the XSTATE_ARM64_SVE flags from winnt.h
33-
34-
#ifndef XSTATE_ARM64_SVE
35-
#define XSTATE_ARM64_SVE (2)
36-
#endif // XSTATE_ARM64_SVE
37-
38-
#ifndef XSTATE_MASK_ARM64_SVE
39-
#define XSTATE_MASK_ARM64_SVE (1ui64 << (XSTATE_ARM64_SVE))
40-
#endif // XSTATE_MASK_ARM64_SVE
41-
42-
#ifndef CONTEXT_ARM64_XSTATE
43-
#define CONTEXT_ARM64_XSTATE (CONTEXT_ARM64 | 0x20L)
44-
#endif // CONTEXT_ARM64_XSTATE
45-
46-
#ifndef CONTEXT_XSTATE
47-
#define CONTEXT_XSTATE CONTEXT_ARM64_XSTATE
48-
#endif // CONTEXT_XSTATE
49-
#endif // TARGET_ARM64
50-
5131
// If you add any thread redirection function, make sure the debugger can 1) recognize the redirection
5232
// function, and 2) retrieve the original CONTEXT. See code:Debugger.InitializeHijackFunctionAddress and
5333
// code:DacDbiInterfaceImpl.RetrieveHijackedContext.

src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
<SharedFrameworkName>$(MicrosoftNetCoreAppFrameworkName)</SharedFrameworkName>
77
<IsShipping Condition="'$(PgoInstrument)' != ''">false</IsShipping>
88
<SharedFrameworkFriendlyName>.NET Runtime</SharedFrameworkFriendlyName>
9-
<EnableDefaultPackageReadmeFile>true</EnableDefaultPackageReadmeFile>
109
</PropertyGroup>
1110

1211
<!--

src/libraries/Directory.Build.targets

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,6 @@
126126
'$(IsTestProject)' != 'true' and
127127
'$(IsTestSupportProject)' != 'true' and
128128
'$(IsGeneratorProject)' != 'true'">true</SkipTargetingPackShimReferences>
129-
130-
<!-- Make libraries packages use and require a package readme file. -->
131-
<EnableDefaultPackageReadmeFile Condition="'$(EnableDefaultPackageReadmeFile)' == '' and '$(IsShipping)' == 'true'">true</EnableDefaultPackageReadmeFile>
132129
</PropertyGroup>
133130

134131
<Import Project="$(RepositoryEngineeringDir)codeOptimization.targets" />

src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.cs

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private TypeSpec CreateTypeSpec(TypeParseInfo typeParseInfo)
197197
}
198198
else if (IsCollection(type))
199199
{
200-
spec = CreateCollectionSpec(typeParseInfo);
200+
spec = CreateCollectionSpec(typeParseInfo) ?? CreateObjectSpec(typeParseInfo);
201201
}
202202
else if (SymbolEqualityComparer.Default.Equals(type, _typeSymbols.IConfigurationSection))
203203
{
@@ -360,34 +360,37 @@ private TypeSpec CreateArraySpec(TypeParseInfo typeParseInfo)
360360
};
361361
}
362362

363-
private TypeSpec CreateCollectionSpec(TypeParseInfo typeParseInfo)
363+
private TypeSpec? CreateCollectionSpec(TypeParseInfo typeParseInfo)
364364
{
365365
INamedTypeSymbol type = (INamedTypeSymbol)typeParseInfo.TypeSymbol;
366366

367-
TypeSpec spec;
367+
TypeSpec? spec;
368368
if (IsCandidateDictionary(type, out ITypeSymbol? keyType, out ITypeSymbol? elementType))
369369
{
370370
spec = CreateDictionarySpec(typeParseInfo, keyType, elementType);
371-
Debug.Assert(spec is DictionarySpec or UnsupportedTypeSpec);
371+
Debug.Assert(spec is DictionarySpec or UnsupportedTypeSpec or null);
372372
}
373373
else
374374
{
375375
spec = CreateEnumerableSpec(typeParseInfo);
376-
Debug.Assert(spec is EnumerableSpec or UnsupportedTypeSpec);
376+
Debug.Assert(spec is EnumerableSpec or UnsupportedTypeSpec or null);
377377
}
378378

379379
return spec;
380380
}
381381

382-
private TypeSpec CreateDictionarySpec(TypeParseInfo typeParseInfo, ITypeSymbol keyTypeSymbol, ITypeSymbol elementTypeSymbol)
382+
private TypeSpec? CreateDictionarySpec(TypeParseInfo typeParseInfo, ITypeSymbol keyTypeSymbol, ITypeSymbol elementTypeSymbol)
383383
{
384+
INamedTypeSymbol type = (INamedTypeSymbol)typeParseInfo.TypeSymbol;
385+
386+
// treat as unsupported if it implements IDictionary<,>, otherwise we'll try to fallback and treat as an object
387+
bool isDictionary = _typeSymbols.GenericICollection is not null && GetInterface(type, _typeSymbols.GenericIDictionary_Unbound) is not null;
388+
384389
if (IsUnsupportedType(keyTypeSymbol) || IsUnsupportedType(elementTypeSymbol))
385390
{
386-
return CreateUnsupportedCollectionSpec(typeParseInfo);
391+
return isDictionary ? CreateUnsupportedCollectionSpec(typeParseInfo) : null;
387392
}
388393

389-
INamedTypeSymbol type = (INamedTypeSymbol)typeParseInfo.TypeSymbol;
390-
391394
CollectionInstantiationStrategy instantiationStrategy;
392395
CollectionInstantiationConcreteType instantiationConcreteType;
393396
CollectionPopulationCastType populationCastType;
@@ -402,14 +405,15 @@ private TypeSpec CreateDictionarySpec(TypeParseInfo typeParseInfo, ITypeSymbol k
402405
{
403406
populationCastType = CollectionPopulationCastType.NotApplicable;
404407
}
405-
else if (_typeSymbols.GenericIDictionary is not null && GetInterface(type, _typeSymbols.GenericIDictionary_Unbound) is not null)
408+
else if (isDictionary)
406409
{
407410
// implements IDictionary<,> -- cast to it.
408411
populationCastType = CollectionPopulationCastType.IDictionary;
409412
}
410413
else
411414
{
412-
return CreateUnsupportedCollectionSpec(typeParseInfo);
415+
// not a dictionary
416+
return null;
413417
}
414418
}
415419
else if (_typeSymbols.Dictionary is not null &&
@@ -429,7 +433,7 @@ private TypeSpec CreateDictionarySpec(TypeParseInfo typeParseInfo, ITypeSymbol k
429433
}
430434
else
431435
{
432-
return CreateUnsupportedCollectionSpec(typeParseInfo);
436+
return isDictionary ? CreateUnsupportedCollectionSpec(typeParseInfo) : null;
433437
}
434438

435439
TypeRef keyTypeRef = EnqueueTransitiveType(typeParseInfo, keyTypeSymbol, DiagnosticDescriptors.DictionaryKeyNotSupported);
@@ -447,18 +451,20 @@ private TypeSpec CreateDictionarySpec(TypeParseInfo typeParseInfo, ITypeSymbol k
447451
};
448452
}
449453

450-
private TypeSpec CreateEnumerableSpec(TypeParseInfo typeParseInfo)
454+
private TypeSpec? CreateEnumerableSpec(TypeParseInfo typeParseInfo)
451455
{
452456
INamedTypeSymbol type = (INamedTypeSymbol)typeParseInfo.TypeSymbol;
453457

458+
bool isCollection = _typeSymbols.GenericICollection is not null && GetInterface(type, _typeSymbols.GenericICollection_Unbound) is not null;
459+
454460
if (!TryGetElementType(type, out ITypeSymbol? elementType))
455461
{
456-
return CreateUnsupportedCollectionSpec(typeParseInfo);
462+
return isCollection ? CreateUnsupportedCollectionSpec(typeParseInfo) : null;
457463
}
458464

459465
if (IsUnsupportedType(elementType))
460466
{
461-
return CreateUnsupportedCollectionSpec(typeParseInfo);
467+
return isCollection ? CreateUnsupportedCollectionSpec(typeParseInfo) : null;
462468
}
463469

464470
CollectionInstantiationStrategy instantiationStrategy;
@@ -475,14 +481,15 @@ private TypeSpec CreateEnumerableSpec(TypeParseInfo typeParseInfo)
475481
{
476482
populationCastType = CollectionPopulationCastType.NotApplicable;
477483
}
478-
else if (_typeSymbols.GenericICollection is not null && GetInterface(type, _typeSymbols.GenericICollection_Unbound) is not null)
484+
else if (isCollection)
479485
{
480486
// implements ICollection<> -- cast to it
481487
populationCastType = CollectionPopulationCastType.ICollection;
482488
}
483489
else
484490
{
485-
return CreateUnsupportedCollectionSpec(typeParseInfo);
491+
// not a collection
492+
return null;
486493
}
487494
}
488495
else if ((IsInterfaceMatch(type, _typeSymbols.GenericICollection_Unbound) || IsInterfaceMatch(type, _typeSymbols.GenericIList_Unbound)))
@@ -523,7 +530,7 @@ private TypeSpec CreateEnumerableSpec(TypeParseInfo typeParseInfo)
523530
}
524531
else
525532
{
526-
return CreateUnsupportedCollectionSpec(typeParseInfo);
533+
return isCollection ? CreateUnsupportedCollectionSpec(typeParseInfo) : null;
527534
}
528535

529536
TypeRef elementTypeRef = EnqueueTransitiveType(typeParseInfo, elementType, DiagnosticDescriptors.ElementTypeNotSupported);

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5+
using System.Collections;
56
using System.Collections.Generic;
67
using System.Collections.ObjectModel;
78
using System.ComponentModel;
@@ -1067,5 +1068,25 @@ public class DerivedClassWithHiddenMembers : IntermediateDerivedClass
10671068
public override int X { set => base.X = value + 1; }
10681069
}
10691070

1071+
public class EnumerableNotCollection : IEnumerable<KeyValuePair<string, string>>
1072+
{
1073+
public string Names { get; set; }
1074+
1075+
public string[] Keywords { get; set; }
1076+
1077+
public bool Enabled { get; set; }
1078+
1079+
private IEnumerable<KeyValuePair<string, string>> enumerate()
1080+
{
1081+
yield return new KeyValuePair<string, string>(nameof(Names), Names);
1082+
yield return new KeyValuePair<string, string>(nameof(Keywords), string.Join(",", Keywords));
1083+
yield return new KeyValuePair<string, string>(nameof(Enabled), Enabled.ToString());
1084+
}
1085+
1086+
public IEnumerator<KeyValuePair<string, string>> GetEnumerator() => enumerate().GetEnumerator();
1087+
1088+
IEnumerator IEnumerable.GetEnumerator() => enumerate().GetEnumerator();
1089+
}
1090+
10701091
}
10711092
}

0 commit comments

Comments
 (0)