dotnet / dotnet/roslyn

`RequiresVariableReceiver` should likely check for "not a reference type" instead of checking for "is a value type"

Open
#73,003 0 comments 0 reactions 0 assignees View on GitHub
Area-Compilers Bug
Dominant language
C#
Stars
20.7k
Forks
4.3k
PR merge metrics
PR metrics pending

Description

This is likely a bug, but needs confirmation on spec side: https://github.com/dotnet/csharpstandard/issues/1078

```
[Fact, WorkItem("")]
public void CS0131ERR_AssgLvalueExpected03_UnconstrainedTypeParameter()
{
var source = """
struct S
{
public object P { get; set; }
public object this[object index] { get { return null; } set { } }
}
interface I
{
object P { get; set; }
object this[object index] { get; set; }
}
class C
{
static void M() where T : I
{
default(T).P = null; // missing diagnostic
default(T)[0] = null; // missing diagnostic
}
}
""";
CreateCompilation(source).VerifyDiagnostics();
}
```

Relevant logic:
```
///
/// SPEC: When a property or indexer declared in a struct-type is the target of an
/// SPEC: assignment, the instance expression associated with the property or indexer
/// SPEC: access must be classified as a variable. If the instance expression is
/// SPEC: classified as a value, a compile-time error occurs. Because of 7.6.4,
/// SPEC: the same rule also applies to fields.
///
///
/// NOTE: The spec fails to impose the restriction that the event receiver must be classified
/// as a variable (unlike for properties - 7.17.1). This seems like a bug, but we have
/// production code that won't build with the restriction in place (see DevDiv #15674).
///
private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
{
return symbol.RequiresInstanceReceiver()
&& symbol.Kind != SymbolKind.Event
&& receiver?.Type?.IsValueType == true;
}
```
FYI @AlekseyTs

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.