Skip to content

Conversation

@sbomer
Copy link
Member

@sbomer sbomer commented Jun 14, 2022

Fixes #2828

The remaining issue was lack of support for IImplicitIndexerReferenceOperation, which represents an implicit access to an indexer that uses System.Index. Implicit means that there is no System.Index accessor in IL, but the compiler supports System.Index access via an existing indexer (for example one that takes int) for types that satisfy certain criteria. See https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges#implicit-index-support for details.

This operation only showed up in the CFG with a more recent version of the Roslyn APIs, so I updated to match the one used in dotnet/runtime. This resulted in a few changes to the generated code that required tweaking some of the test validation:

  • Delegate cache fields are emitted. I reused an existing attribute originally designed for mcs, but updated it to check for these compiler-generated fields.
  • <PrivateImplementationDetails>.ThrowSwitchExpressionException is emitted for an implicit unhandled case in switch expressions. I added an attribute to check that this is kept in a few of the tests.

@sbomer sbomer requested a review from marek-safar as a code owner June 14, 2022 23:22
@sbomer sbomer requested review from agocke and vitek-karas June 14, 2022 23:35
@sbomer sbomer changed the title Indexer reference Analyze implicit indexer reference operations Jun 14, 2022
@sbomer sbomer merged commit 226107b into dotnet:main Jun 15, 2022
@sbomer sbomer deleted the indexerReference branch June 15, 2022 16:28
jtschuster pushed a commit to jtschuster/linker that referenced this pull request Jun 20, 2022
Adds support for `IImplicitIndexerReferenceOperation`, which
represents an implicit access to an indexer that uses
`System.Index`. Implicit means that there is no `System.Index`
accessor in IL, but the compiler supports `System.Index` access
via an existing indexer (for example one that takes int) for
types that satisfy certain criteria. See
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges#implicit-index-support
for details.

This operation only showed up in the CFG with a more recent
version of the Roslyn APIs, so this includes an update to match
the one used in dotnet/runtime. This resulted in a few changes to
the generated code that required tweaking some of the test
validation:

- Delegate cache fields are emitted. This reuses an existing
attribute originally designed for mcs, but it has been updated to
check for these compiler-generated fields.

- `<PrivateImplementationDetails>.ThrowSwitchExpressionException`
is emitted for an implicit unhandled case in switch
expressions. This change includes a new attribute to check that
this is kept in a few of the tests.
agocke pushed a commit to dotnet/runtime that referenced this pull request Nov 16, 2022
Adds support for `IImplicitIndexerReferenceOperation`, which
represents an implicit access to an indexer that uses
`System.Index`. Implicit means that there is no `System.Index`
accessor in IL, but the compiler supports `System.Index` access
via an existing indexer (for example one that takes int) for
types that satisfy certain criteria. See
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges#implicit-index-support
for details.

This operation only showed up in the CFG with a more recent
version of the Roslyn APIs, so this includes an update to match
the one used in dotnet/runtime. This resulted in a few changes to
the generated code that required tweaking some of the test
validation:

- Delegate cache fields are emitted. This reuses an existing
attribute originally designed for mcs, but it has been updated to
check for these compiler-generated fields.

- `<PrivateImplementationDetails>.ThrowSwitchExpressionException`
is emitted for an implicit unhandled case in switch
expressions. This change includes a new attribute to check that
this is kept in a few of the tests.

Commit migrated from dotnet/linker@226107b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DynamicallyAccessedMembersAnalyzer null ref'ing on some dotnet/runtime projects

2 participants