Skip to content

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

@jcouv

Description

@jcouv

This is likely a bug, but needs confirmation on spec side: dotnet/csharpstandard#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<T>() where T : I
    {
        default(T).P = null; // missing diagnostic
        default(T)[0] = null; // missing diagnostic
    }
}
""";
            CreateCompilation(source).VerifyDiagnostics();
        }

Relevant logic:

        /// <summary>
        /// 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.
        /// </summary>
        /// <remarks>
        /// 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).
        /// </remarks>
        private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
        {
            return symbol.RequiresInstanceReceiver()
                && symbol.Kind != SymbolKind.Event
                && receiver?.Type?.IsValueType == true;
        }

FYI @AlekseyTs

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions