Binder\Binder.ValueChecks.cs (88)
91internal RefKind RefKind { get; }
93internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
101public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
327ArrayBuilder<RefKind>? refKindsBuilderOpt;
330refKindsBuilderOpt = ArrayBuilder<RefKind>.GetInstance(accessorForDefaultArguments.ParameterCount);
839if (localSymbol.RefKind == RefKind.RefReadOnly ||
840(localSymbol.RefKind == RefKind.None && !localSymbol.IsWritableVariable))
848if (localSymbol.RefKind == RefKind.None)
880if (localSymbol.RefKind == RefKind.None)
923if (parameterSymbol.RefKind == RefKind.In && RequiresAssignableVariable(valueKind))
928else if (parameterSymbol.RefKind == RefKind.None && RequiresRefAssignableVariable(valueKind))
934Debug.Assert(parameterSymbol.RefKind != RefKind.None || !RequiresRefAssignableVariable(valueKind));
938if (parameterSymbol.RefKind == RefKind.None &&
942Debug.Assert(backingField.RefKind == RefKind.None);
947Debug.Assert(backingField.RefKind == RefKind.None);
1037{ RefKind: RefKind.Out, UseUpdatedEscapeRules: true } => ReturnOnlyScope,
1049{ RefKind: RefKind.None } => CurrentMethodScope,
1051{ HasUnscopedRefAttribute: true, RefKind: RefKind.Out } => ReturnOnlyScope,
1085Debug.Assert(parameterSymbol.RefKind == RefKind.None || isRefScoped || refSafeToEscape == ReturnOnlyScope);
1135if ((fieldSymbol.RefKind == RefKind.None ? RequiresAssignableVariable(valueKind) : RequiresRefAssignableVariable(valueKind)) &&
1147case RefKind.None:
1149case RefKind.Ref:
1151case RefKind.RefReadOnly:
1172case RefKind.None:
1175case RefKind.Ref:
1176case RefKind.RefReadOnly:
1275if (fieldSymbol.RefKind != RefKind.None)
1299if (fieldSymbol.RefKind != RefKind.None)
1435if (RequiresVariable(valueKind) && methodSymbol.RefKind == RefKind.None)
1450if (RequiresAssignableVariable(valueKind) && methodSymbol.RefKind == RefKind.RefReadOnly)
1481propertySymbol.RefKind == RefKind.None)
1505if (RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.RefReadOnly)
1511var requiresSet = RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.None;
1580var requiresGet = !RequiresAssignmentOnly(valueKind) || propertySymbol.RefKind != RefKind.None;
1742ImmutableArray<RefKind> argRefKindsOpt,
1803var argEscape = effectiveRefKind != RefKind.None && isRefEscape ?
1835ImmutableArray<RefKind> argRefKindsOpt,
1863|| (param is null or { RefKind: not RefKind.None, Type.IsRefLikeType: true } && isArgumentRefEscape == isRefEscape))
1892return method is { RefKind: not RefKind.None, ReturnType.IsRefLikeType: true };
1909ImmutableArray<RefKind> argRefKindsOpt,
1964var valid = effectiveRefKind != RefKind.None && isRefEscape ?
1995ImmutableArray<RefKind> argRefKindsOpt,
2025|| (param is null or { RefKind: not RefKind.None, Type.IsRefLikeType: true } && isArgumentRefEscape == isRefEscape))
2062ImmutableArray<RefKind> argRefKindsOpt,
2133var refKind = parameter?.RefKind ?? RefKind.None;
2138if (refKind == RefKind.None &&
2139parameter?.RefKind == RefKind.In)
2141refKind = RefKind.In;
2170return new EscapeArgument(parameter: null, receiver, RefKind.None);
2173var refKind = RefKind.None;
2187ImmutableArray<RefKind> argRefKindsOpt,
2194var refKind = argRefKindsOpt.IsDefault ? RefKind.None : argRefKindsOpt[argIndex];
2197if (refKind == RefKind.Ref && mixableArguments is not null)
2216ImmutableArray<RefKind> argRefKindsOpt,
2292ImmutableArray<RefKind> argRefKindsOpt,
2321if (refKind != RefKind.None)
2334if (parameter.Type.IsRefLikeType && parameter.RefKind != RefKind.Out && GetParameterValEscapeLevel(parameter) is { } valEscapeLevel)
2341if (parameter.RefKind != RefKind.None && GetParameterRefEscapeLevel(parameter) is { } refEscapeLevel)
2422ImmutableArray<RefKind> argRefKindsOpt,
2524ImmutableArray<RefKind> argRefKindsOpt,
2821Debug.Assert(field.RefKind == RefKind.None ? RequiresAssignableVariable(kind) : RequiresRefAssignableVariable(kind));
3014if (methodSymbol.RefKind == RefKind.None)
3035if (methodSymbol.RefKind == RefKind.None)
3093if (methodSymbol.RefKind == RefKind.None)
3259if (methodSymbol.RefKind == RefKind.None)
3284if (indexerSymbol.RefKind == RefKind.None)
3314if (indexerSymbol.RefKind == RefKind.None)
3339if (methodSymbol.RefKind == RefKind.None)
3367if (signature.RefKind == RefKind.None)
3390if (propertySymbol.RefKind == RefKind.None)
4630((BoundParameter)expression).ParameterSymbol.RefKind != RefKind.In;
4636return !((CodeGenerator.IsStackLocal(local, stackLocalsOpt) && local.RefKind == RefKind.None) ||
4637(!IsAnyReadOnly(addressKind) && local.RefKind == RefKind.RefReadOnly));
4640var methodRefKind = ((BoundCall)expression).Method.RefKind;
4641return methodRefKind == RefKind.Ref ||
4642(IsAnyReadOnly(addressKind) && methodRefKind == RefKind.RefReadOnly);
4646var dupRefKind = ((BoundDup)expression).RefKind;
4647return dupRefKind == RefKind.Ref ||
4648(IsAnyReadOnly(addressKind) && dupRefKind == RefKind.RefReadOnly);
4662var lhsRefKind = assignment.Left.GetRefKind();
4663return lhsRefKind == RefKind.Ref ||
4664(IsAnyReadOnly(addressKind) && lhsRefKind == RefKind.RefReadOnly);
4730if (field.RefKind is RefKind.Ref)
4753if (field.RefKind == RefKind.RefReadOnly)
4758Debug.Assert(field.RefKind == RefKind.None);
Binder\Binder_Expressions.cs (47)
447RefKind refKind,
1777private bool IsBadLocalOrParameterCapture(Symbol symbol, TypeSymbol type, RefKind refKind)
1779if (refKind != RefKind.None || type.IsRefLikeType)
1942(parameter.RefKind != RefKind.None || parameter.Type.IsRefLikeType) &&
1947else if (primaryCtor is { ThisParameter.RefKind: not RefKind.None } &&
2284if ((object)thisSymbol != null && thisSymbol.ContainingSymbol != ContainingMemberOrLambda && thisSymbol.RefKind != RefKind.None)
2832RefKind origRefKind = argumentSyntax.RefOrOutKeyword.Kind().GetRefKind();
2836RefKind refKind = origRefKind == RefKind.None || RefMustBeObeyed(isDelegateCreation, argumentSyntax) ? origRefKind : RefKind.None;
2849if (!hadError && isDelegateCreation && origRefKind != RefKind.None && result.Arguments.Count == 1)
2856var requiredValueKind = origRefKind == RefKind.In ? BindValueKind.ReadonlyRef : BindValueKind.RefOrOut;
2868private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3067RefKind refKind)
3075if (refKind != RefKind.None)
3085result.RefKinds.Add(RefKind.None);
3133private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3136refKind == RefKind.None ?
3138refKind == RefKind.In ?
4282if (analyzedArguments.RefKind(i) is (RefKind.Ref or RefKind.Out))
4696ArrayBuilder<RefKind> refKinds,
4887var rhsExpr = initializer.Right.CheckAndUnwrapRefExpression(diagnostics, out RefKind refKind);
4888bool isRef = refKind == RefKind.Ref;
5006ImmutableArray<RefKind> argumentRefKindsOpt = default;
7142extensionMethodArguments.RefKinds.Add(RefKind.None);
7276RefKind returnRefKind,
7523fieldSymbol.RefKind != RefKind.None)
8229RefKind refKind = analyzedArguments.RefKind(i);
8230if (refKind != RefKind.None)
8329default(ImmutableArray<RefKind>),
8424ImmutableArray<RefKind> argumentRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
8675original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None })
8732original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None } &&
8733original.Parameters[1] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None })
8832getMethod.RefKind == RefKind.None &&
8877RefKind returnRefKind = default,
8897RefKind returnRefKind = default,
8925RefKind returnRefKind,
8951RefKind returnRefKind = default,
9023RefKind returnRefKind = default,
9187RefKind? returnRefKindOverride = null,
9194var returnRefKind = returnRefKindOverride ?? methodSymbol.RefKind;
9213if (returnsVoid && returnRefKind != RefKind.None)
9227returnRefKind == RefKind.None &&
9229(parameterRefKinds.IsDefault || parameterRefKinds.All(refKind => refKind == RefKind.None)) &&
9263parameterRefKinds.IsDefault ? RefKind.None : parameterRefKinds[i],
Binder\Binder_Query.cs (3)
695return lambdaBodyBinder.CreateBlockFromExpression(node, ImmutableArray<LocalSymbol>.Empty, RefKind.None, construction, null, d);
775return this.CreateBlockFromExpression(expression, locals, RefKind.None, result, expression, diagnostics);
817new AnonymousTypeField(fieldName, fieldValue.Syntax.Location, TypeWithAnnotations.Create(TypeOrError(fieldValue)), RefKind.None, ScopedKind.None);
Binder\Binder_Statements.cs (48)
864internal BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, RefKind refKind, EqualsValueClauseSyntax initializer,
913RefKind variableRefKind,
918RefKind expressionRefKind = RefKind.None;
920if (variableRefKind == RefKind.None)
923if (expressionRefKind == RefKind.Ref)
931valueKind = variableRefKind == RefKind.RefReadOnly
940else if (expressionRefKind != RefKind.Ref)
1001if (localSymbol.RefKind != RefKind.None)
1067localSymbol.RefKind != RefKind.None ? ConversionForAssignmentFlags.RefAssignment : ConversionForAssignmentFlags.None);
1424var rhsExpr = node.Right.CheckAndUnwrapRefExpression(diagnostics, out var refKind);
1425var isRef = refKind == RefKind.Ref;
1454var lhsRefKind = boundLeft.GetRefKind();
1455if (lhsRefKind is RefKind.Ref or RefKind.Out)
2110var delegateRefKind = delegateParameters[i].RefKind;
2111if (delegateRefKind != RefKind.None)
2151var lambdaRefKind = anonymousFunction.RefKind(i);
2153var delegateRefKind = delegateParameters[i].RefKind;
2165if (delegateRefKind == RefKind.None)
2865protected virtual TypeSymbol GetCurrentReturnType(out RefKind refKind)
2882refKind = RefKind.None;
2888var refKind = RefKind.None;
2906RefKind sigRefKind;
2917if (refKind != RefKind.None)
2929else if ((object)retType != null && (refKind != RefKind.None) != (sigRefKind != RefKind.None))
2931var errorCode = refKind != RefKind.None
3029RefKind returnRefKind,
3039Debug.Assert(returnRefKind == RefKind.None);
3061if (returnRefKind != RefKind.None)
3077RefKind unusedRefKind;
3345internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3347RefKind returnRefKind;
3352if (IsInAsyncMethod() && refKind != RefKind.None)
3361if ((refKind != RefKind.None) != (returnRefKind != RefKind.None) && expression.Kind != BoundKind.ThrowExpression)
3363var errorCode = refKind != RefKind.None
3368statement = new BoundReturnStatement(syntax, RefKind.None, expression, @checked: CheckOverflowAtRuntime) { WasCompilerGenerated = true };
3472RefKind refKind;
3488RefKind refKind;
3501return bodyBinder.CreateBlockFromExpression(body, bodyBinder.GetDeclaredLocalsForScope(body), RefKind.None, expression, body, diagnostics);
3504private BindValueKind GetRequiredReturnValueKind(RefKind refKind)
3507if (refKind != RefKind.None)
3509GetCurrentReturnType(out var sigRefKind);
3510requiredValueKind = sigRefKind == RefKind.Ref ?
3865argumentRefKindsOpt: ImmutableArray<RefKind>.Empty,
Binder\Semantics\OverloadResolution\OverloadResolution.cs (61)
128RefKind returnRefKind = default,
168RefKind returnRefKind = default,
236RefKind returnRefKind,
619RefKind? returnRefKind,
644else if (returnRefKind == RefKind.None)
2165if (p1.RefKind == RefKind.None && isAcceptableRefMismatch(p2.RefKind, isInterpolatedStringHandlerConversion))
2176else if (p2.RefKind == RefKind.None && isAcceptableRefMismatch(p1.RefKind, isInterpolatedStringHandlerConversion))
2192static bool isAcceptableRefMismatch(RefKind refKind, bool isInterpolatedStringHandlerConversion)
2195RefKind.In => true,
2196RefKind.Ref when isInterpolatedStringHandlerConversion => true,
2372RefKind refKind1,
2375RefKind refKind2,
2400Debug.Assert(refKind1 == RefKind.None || refKind1 == RefKind.Ref);
2401Debug.Assert(refKind2 == RefKind.None || refKind2 == RefKind.Ref);
2405if (refKind1 == RefKind.None)
2414else if (refKind1 == RefKind.Ref)
3077ArrayBuilder<RefKind> argumentRefKinds,
3083out ImmutableArray<RefKind> parameterRefKinds)
3096internal readonly ImmutableArray<RefKind> ParameterRefKinds;
3098internal EffectiveParameters(ImmutableArray<TypeWithAnnotations> types, ImmutableArray<RefKind> refKinds)
3109ArrayBuilder<RefKind> argumentRefKinds,
3122ArrayBuilder<RefKind> argumentRefKinds,
3138ImmutableArray<RefKind> parameterRefKinds = member.GetParameterRefKinds();
3146ArrayBuilder<RefKind> refs = null;
3160RefKind argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
3161RefKind paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, isMethodGroupConversion, allowRefOmittedArguments, binder, ref hasAnyRefOmittedArgument);
3165if (paramRefKind != RefKind.None)
3167refs = ArrayBuilder<RefKind>.GetInstance(arg, RefKind.None);
3177var refKinds = refs != null ? refs.ToImmutableAndFree() : default(ImmutableArray<RefKind>);
3181private static RefKind GetEffectiveParameterRefKind(
3183RefKind argRefKind,
3189var paramRefKind = parameter.RefKind;
3193if (!isMethodGroupConversion && argRefKind == RefKind.None && paramRefKind == RefKind.In)
3195return RefKind.None;
3201if (allowRefOmittedArguments && paramRefKind == RefKind.Ref && argRefKind == RefKind.None && !binder.InAttributeArgument)
3204return RefKind.None;
3214ArrayBuilder<RefKind> argumentRefKinds,
3226ArrayBuilder<RefKind> argumentRefKinds,
3235var refs = ArrayBuilder<RefKind>.GetInstance();
3249var argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
3250var paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, isMethodGroupConversion, allowRefOmittedArguments, binder, ref hasAnyRefOmittedArgument);
3253if (paramRefKind != RefKind.None)
3259var refKinds = anyRef ? refs.ToImmutable() : default(ImmutableArray<RefKind>);
3661RefKind argumentRefKind = arguments.RefKind(argumentPosition);
3662RefKind parameterRefKind = parameters.ParameterRefKinds.IsDefault ? RefKind.None : parameters.ParameterRefKinds[argumentPosition];
3667Debug.Assert(argumentRefKind == RefKind.None);
3668if (parameterRefKind == RefKind.Ref)
3679&& parameterRefKind == RefKind.Ref
3754RefKind argRefKind,
3756RefKind parRefKind,
3773(argRefKind == RefKind.None && argument.HasDynamicType())))
3795Debug.Assert(argRefKind != RefKind.None);
3801if (argRefKind == RefKind.None || hasInterpolatedStringRefMismatch)
BoundTree\BoundObjectCreationExpression.cs (3)
13ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt,
18public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded,
25ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt,
BoundTree\Constructors.cs (9)
90ImmutableArray<RefKind> argumentRefKindsOpt,
107ImmutableArray<RefKind> argumentRefKindsOpt,
123ImmutableArray<RefKind> refKinds,
203: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
207: this(syntax, constructor, arguments, default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
220ImmutableArray<RefKind> refKinds,
243ImmutableArray<RefKind> argumentRefKindsOpt,
256ImmutableArray<RefKind> argumentRefKindsOpt,
574public static BoundReturnStatement Synthesized(SyntaxNode syntax, RefKind refKind, BoundExpression expression, bool hasErrors = false)
BoundTree\UnboundLambda.cs (49)
43internal readonly RefKind RefKind;
53RefKind refKind,
171ImmutableArray<RefKind> parameterRefKinds,
172RefKind refKind)
177parameterRefKinds.IsDefault ? Enumerable.Repeat(RefKind.None, parameterTypes.Length).ToImmutableArray() : parameterRefKinds,
207RefKind refKind = RefKind.None;
210RefKind rk = returnStatement.RefKind;
211if (rk != RefKind.None)
394RefKind returnRefKind,
397ImmutableArray<RefKind> refKinds,
463public bool HasExplicitReturnType(out RefKind refKind, out TypeWithAnnotations returnType)
472public RefKind RefKind(int index) { return Data.RefKind(index); }
547public abstract bool HasExplicitReturnType(out RefKind refKind, out TypeWithAnnotations returnType);
555public abstract RefKind RefKind(int index);
618private static TypeWithAnnotations DelegateReturnTypeWithAnnotations(MethodSymbol? invokeMethod, out RefKind refKind)
622refKind = CodeAnalysis.RefKind.None;
629internal (ImmutableArray<RefKind>, ArrayBuilder<ScopedKind>, ImmutableArray<TypeWithAnnotations>, bool) CollectParameterProperties()
631var parameterRefKindsBuilder = ArrayBuilder<RefKind>.GetInstance(ParameterCount);
638var refKind = RefKind(i);
679if (!HasExplicitReturnType(out var returnRefKind, out var returnType))
740var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind);
759refKind == CodeAnalysis.RefKind.None &&
779if (lambdaSymbol.RefKind == CodeAnalysis.RefKind.RefReadOnly)
845ImmutableArray<RefKind> parameterRefKinds,
846RefKind refKind)
860var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind);
893ImmutableArray<RefKind> parameterRefKinds)
895bool hasExplicitReturnType = HasExplicitReturnType(out var refKind, out var returnType);
950ImmutableArray<RefKind> parameterRefKinds,
952RefKind refKind)
986public readonly ImmutableArray<RefKind> ParameterRefKinds;
989public static readonly ReturnInferenceCacheKey Empty = new ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty, null);
991private ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations> parameterTypes, ImmutableArray<RefKind> parameterRefKinds, NamedTypeSymbol? taskLikeReturnTypeOpt)
1052out ImmutableArray<RefKind> parameterRefKinds,
1058parameterRefKinds = ImmutableArray<RefKind>.Empty;
1067var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameterCount);
1143?? rebind(ReallyInferReturnType(delegateType: null, ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty));
1160ImmutableArray<RefKind> parameterRefKinds)
1163var refKind = inferredReturnType.RefKind;
1175refKind = CodeAnalysis.RefKind.None;
1388private readonly RefKind _returnRefKind;
1394private readonly ImmutableArray<RefKind> _parameterRefKinds;
1404RefKind returnRefKind,
1410ImmutableArray<RefKind> parameterRefKinds,
1437public override bool HasExplicitReturnType(out RefKind refKind, out TypeWithAnnotations returnType)
1498public override RefKind RefKind(int index)
1501return _parameterRefKinds.IsDefault ? Microsoft.CodeAnalysis.RefKind.None : _parameterRefKinds[index];
1536statements[0] is BoundReturnStatement { RefKind: Microsoft.CodeAnalysis.RefKind.None, ExpressionOpt: BoundExpression expr })
CodeGen\EmitExpression.cs (43)
698RefKind refKind = expression.ArgumentRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : expression.ArgumentRefKindsOpt[i];
703private void EmitArgument(BoundExpression argument, RefKind refKind)
707case RefKind.None:
711case RefKind.In:
765if (expression.RefKind == RefKind.None)
932private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
936Debug.Assert(parameters.All(p => p.RefKind == RefKind.None) || !argRefKindsOpt.IsDefault, "there are nontrivial parameters, so we must have argRefKinds");
941RefKind argRefKind = GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
950internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
952RefKind argRefKind;
961argRefKind == RefKindExtensions.StrictIn && parameters[i].RefKind == RefKind.In,
974argRefKind = RefKind.None;
1092if (!field.IsVolatile && !field.IsStatic && fieldAccess.ReceiverOpt.Type.IsVerifierValue() && field.RefKind == RefKind.None)
1104if (field.RefKind != RefKind.None)
1248return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
1252return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
1261if (field.IsStatic || field.RefKind != RefKind.None)
1352bool isRefLocal = local.LocalSymbol.RefKind != RefKind.None;
1384if (parameter.ParameterSymbol.RefKind != RefKind.None)
1994return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
1997return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2000return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2003return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2006return ((BoundDup)receiver).RefKind != RefKind.None;
2416if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2540return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2545return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2565if (left.FieldSymbol.RefKind != RefKind.None &&
2582if (left.ParameterSymbol.RefKind != RefKind.None &&
2614if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
2713Debug.Assert(left.Method.RefKind != RefKind.None);
2724Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
2776LocalDefinition temp = EmitAddress(assignmentOperator.Right, lhs.GetRefKind() == RefKind.RefReadOnly ? AddressKind.ReadOnlyStrict : AddressKind.Writeable);
2859if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
2892Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
2915Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
2920Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3064if (field.RefKind != RefKind.None && !refAssign)
3079if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
3814if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
3820Debug.Assert(method.RefKind != RefKind.None);
CodeGen\Optimizer.cs (22)
857if (node.LocalSymbol.RefKind != RefKind.None)
877if (node.LocalSymbol.RefKind != RefKind.None)
985if (localSymbol.RefKind == RefKind.RefReadOnly &&
1030(lhs.Kind is BoundKind.Local or BoundKind.Parameter or BoundKind.FieldAccess && lhs.GetRefKind() != RefKind.None),
1040if (((BoundParameter)lhs).ParameterSymbol.RefKind != RefKind.None)
1048if (((BoundLocal)lhs).LocalSymbol.RefKind != RefKind.None)
1056Debug.Assert(((BoundCall)lhs).Method.RefKind == RefKind.Ref, "only ref returning methods are assignable");
1060Debug.Assert(((BoundFunctionPointerInvocation)lhs).FunctionPointer.Signature.RefKind == RefKind.Ref, "only ref returning function pointers are assignable");
1157if (unwrappedSequence is BoundLocal { LocalSymbol: { RefKind: not RefKind.None } localSymbol })
1188private ImmutableArray<BoundExpression> VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
1198RefKind argRefKind = CodeGenerator.GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
1205private void VisitArgument(ImmutableArray<BoundExpression> arguments, ref ArrayBuilder<BoundExpression> rewrittenArguments, int i, RefKind argRefKind)
1207ExprContext context = (argRefKind == RefKind.None) ? ExprContext.Value : ExprContext.Address;
1229ImmutableArray<RefKind> argRefKindsOpt = node.ArgumentRefKindsOpt;
1233RefKind refKind = argRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : argRefKindsOpt[i];
1361if (localSym.RefKind == RefKind.None)
1807Debug.Assert(local.RefKind == RefKind.None, "cannot take a ref of a ref");
1868return top.Item2 == (local.RefKind == RefKind.None ? ExprContext.Value : ExprContext.Address) &&
2095var isIndirectLocalStore = left.LocalSymbol.RefKind != RefKind.None && !node.IsRef;
2303public override RefKind RefKind
2305get { return RefKind.None; }
Compiler\MethodBodySynthesizer.cs (5)
49argumentRefKindsOpt: ImmutableArray<RefKind>.Empty,
192statement = new BoundReturnStatement(accessor.SyntaxNode, RefKind.None, fieldAccess, @checked: false);
308BoundStatement returnStatement = BoundReturnStatement.Synthesized(syntax, RefKind.None, processHandlerCall);
318BoundStatement returnStatement = new BoundReturnStatement(syntax, RefKind.None, expressionOpt: null, @checked: false);
355refKind: RefKind.None,
FlowAnalysis\AbstractFlowPass.cs (32)
1076VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), null);
1237VisitRvalue(node.InitializerOpt, isKnownToBeAnLvalue: node.LocalSymbol.RefKind != RefKind.None);
1240if (node.LocalSymbol.RefKind != RefKind.None)
1349WriteArgument(receiverOpt, RefKind.Ref, method: null);
1355var thisRefKind = thisParameter.RefKind;
1429protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method)
1436private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1441RefKind refKind = GetRefKind(refKindsOpt, i);
1442if (refKind != RefKind.Out)
1444VisitRvalue(arguments[i], isKnownToBeAnLvalue: refKind != RefKind.None);
1456private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method)
1460RefKind refKind = GetRefKind(refKindsOpt, i);
1462if (refKind != RefKind.None)
1469protected static RefKind GetRefKind(ImmutableArray<RefKind> refKindsOpt, int index)
1471return refKindsOpt.IsDefault || refKindsOpt.Length <= index ? RefKind.None : refKindsOpt[index];
1474protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
1885VisitRvalue(node.ExpressionOpt, isKnownToBeAnLvalue: node.RefKind != RefKind.None);
1888if (node.RefKind != RefKind.None)
1966if (property.RefKind == RefKind.None)
1984var refKind = node.Left.Kind == BoundKind.BadExpression
1985? RefKind.Ref
2021if (property.RefKind == RefKind.None)
2040if (property.RefKind == RefKind.None)
2613if (property.RefKind == RefKind.None)
3110WriteArgument(operand, RefKind.Ref, method: null);
3296this.WriteArgument(operand, RefKind.Out, null); //Out because we know it will definitely be assigned.
3337VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.Constructor);
3421VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod);
3427VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod);
3435VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), method: null);
3517property.RefKind == RefKind.None)
FlowAnalysis\NullableWalker.cs (48)
1207var refKind = parameter.RefKind;
1208if (refKind != RefKind.Out && refKind != RefKind.Ref)
2303RefKind refKind,
2313if (refKind == RefKind.Ref)
2316return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2317AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2320if (refKind == RefKind.None || refKind == RefKind.In)
2350if (refKind == RefKind.Out)
2744if (parameter.RefKind != RefKind.Out)
2817if (node.RefKind == RefKind.None &&
2826if (node.RefKind == RefKind.None)
5689ImmutableArray<RefKind> refKindsOpt = node.ArgumentRefKindsOpt;
6103protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method)
6112ImmutableArray<RefKind> refKindsOpt,
6125ImmutableArray<RefKind> refKindsOpt,
6140ImmutableArray<RefKind> refKindsOpt,
6160ImmutableArray<RefKind> refKindsOpt,
6187ImmutableArray<RefKind> refKindsOpt,
6342ImmutableArray<RefKind> refKindsOpt,
6455ImmutableArray<RefKind> refKindsOpt,
6494private VisitArgumentResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
6502case RefKind.Ref:
6506case RefKind.None:
6507case RefKind.In:
6531case RefKind.Out:
6552RefKind refKind,
6567case RefKind.None:
6568case RefKind.In:
6606case RefKind.Ref:
6626case RefKind.Out:
6689RefKind refKind,
6702case RefKind.None:
6703case RefKind.In:
6709case RefKind.Ref:
6736case RefKind.Out:
6942ImmutableArray<RefKind> refKindsOpt)
6953RefKind refKind = GetRefKind(refKindsOpt, i);
6956if (refKind == RefKind.None)
7017ImmutableArray<RefKind> argumentRefKindsOpt,
7026var refKinds = ArrayBuilder<RefKind>.GetInstance();
7047parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
9203return expr.GetRefKind() == RefKind.None;
9205RefKind kind = ((BoundParameter)expr).ParameterSymbol.RefKind;
9206return kind == RefKind.None;
11079TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
11119VisitArguments(node, node.ConstructorArguments, ImmutableArray<RefKind>.Empty, node.Constructor, argsToParamsOpt: node.ConstructorArgumentsToParamsOpt, defaultArguments: default,
Generated\BoundNodes.xml.Generated.cs (37)
908public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type, bool hasErrors)
914public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type)
920public RefKind RefKind { get; }
925public BoundDup Update(RefKind refKind, TypeSymbol? type)
1433public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1450public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
1456public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
2952public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
2964public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
2969public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3458public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3466public RefKind RefKind { get; }
3473public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5782public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5798public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
5804public BoundDynamicInvocation Update(ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6032public BoundCall(SyntaxNode syntax, BoundExpression? receiverOpt, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type, bool hasErrors = false)
6059public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6071public BoundCall Update(BoundExpression? receiverOpt, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type)
6169public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6186public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6193public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6228public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6254public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6265public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type)
6354public BoundDynamicObjectCreationExpression(SyntaxNode syntax, string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6375public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6383public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6476public BoundObjectInitializerMember(SyntaxNode syntax, Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, TypeSymbol receiverType, TypeSymbol type, bool hasErrors = false)
6499public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6509public BoundObjectInitializerMember Update(Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, TypeSymbol receiverType, TypeSymbol type)
7138public BoundIndexerAccess(SyntaxNode syntax, BoundExpression? receiverOpt, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type, bool hasErrors = false)
7162public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7171public BoundIndexerAccess Update(BoundExpression? receiverOpt, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type)
7234public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7254public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7260public BoundDynamicIndexerAccess Update(BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type)
Lowering\LocalRewriter\LocalRewriter_Call.cs (64)
182ImmutableArray<RefKind> argumentRefKindsOpt,
210ImmutableArray<RefKind> argumentRefKinds,
295argumentRefKinds: default(ImmutableArray<RefKind>),
302private static bool IsSafeForReordering(BoundExpression expression, RefKind kind)
328return kind != RefKind.None;
426ImmutableArray<RefKind> argumentRefKindsOpt,
445RefKind refKind;
457refKind = rewrittenReceiver.Type.IsValueType || rewrittenReceiver.Type.Kind == SymbolKind.TypeParameter ? RefKind.Ref : RefKind.None;
463if (refKind == RefKind.None &&
471refKind = RefKind.Ref;
637RefKind argRefKind = argumentRefKindsOpt.RefKinds(argIndex);
638RefKind paramRefKind = parameters[paramIndex].RefKind;
640local = _factory.StoreToTemp(visitedArgument, out var store, refKind: paramRefKind == RefKind.In ? RefKind.In : argRefKind);
709var intermediateRef = _factory.Local(_factory.SynthesizedLocal(receiverType, refKind: RefKind.Ref));
761ref ImmutableArray<RefKind> argumentRefKindsOpt,
836ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
893private static ImmutableArray<RefKind> GetEffectiveArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters)
895ArrayBuilder<RefKind>? refKindsBuilder = null;
898var paramRefKind = parameters[i].RefKind;
899if (paramRefKind == RefKind.In)
901var argRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
903refKindsBuilder[i] = argRefKind == RefKind.None ? paramRefKind : RefKindExtensions.StrictIn;
905else if (paramRefKind == RefKind.Ref)
907var argRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
908if (argRefKind == RefKind.None)
914refKindsBuilder[i] = RefKind.Ref;
928static void fillRefKindsBuilder(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters, [NotNull] ref ArrayBuilder<RefKind>? refKindsBuilder)
935refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length);
940refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length, fillWithValue: RefKind.None);
1041private static ImmutableArray<RefKind> GetRefKindsOrNull(ArrayBuilder<RefKind> refKinds)
1043foreach (var refKind in refKinds)
1045if (refKind != RefKind.None)
1050return default(ImmutableArray<RefKind>);
1058ImmutableArray<RefKind> argumentRefKinds,
1062/* out */ ArrayBuilder<RefKind> refKinds,
1072RefKind argRefKind = argumentRefKinds.RefKinds(a);
1073RefKind paramRefKind = parameters[p].RefKind;
1114refKind: paramRefKind == RefKind.In ? RefKind.In : argRefKind);
1125if (paramRefKind == RefKind.In)
1127Debug.Assert(argRefKind == RefKind.None || argRefKind == RefKind.In);
1128argRefKind = argRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn;
1299default(ImmutableArray<RefKind>),
1475ArrayBuilder<RefKind> argsRefKindsBuilder,
1488RefKind paramRefKind = parameters[argIndex].RefKind;
1489RefKind argRefKind = argsRefKindsBuilder[argIndex];
1493if (argRefKind != RefKind.None || paramRefKind != RefKind.Ref)
1501var localRefKind = ((BoundLocal)argument).LocalSymbol.RefKind;
1502if (localRefKind == RefKind.Ref)
1508Debug.Assert(localRefKind == RefKind.None);
1520argsRefKindsBuilder[argIndex] = RefKind.Ref;
Lowering\LocalRewriter\LoweredDynamicOperationFactory.cs (53)
111return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
147return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
190return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
199ImmutableArray<RefKind> refKinds,
223RefKind receiverRefKind;
228receiverRefKind = RefKind.None;
292return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredHandler, resultType);
299ImmutableArray<RefKind> refKinds,
329return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
337ImmutableArray<RefKind> refKinds)
356return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, type);
391return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
432return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredRight, AssemblySymbol.DynamicType);
439ImmutableArray<RefKind> refKinds)
458return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
465ImmutableArray<RefKind> refKinds,
481var loweredReceiverRefKind = GetReceiverRefKind(loweredReceiver);
516return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
542internal static RefKind GetReceiverRefKind(BoundExpression loweredReceiver)
547return RefKind.None;
562return RefKind.Ref;
570return RefKind.None;
577ImmutableArray<RefKind> refKinds = default(ImmutableArray<RefKind>),
579RefKind receiverRefKind = RefKind.None,
586Debug.Assert(!receiverIsStaticType || receiverRefKind == RefKind.None);
601refKinds.IsDefault ? RefKind.None : refKinds[i],
607infos[j++] = GetArgumentInfo(argumentInfoFactory, loweredRight, NoName, RefKind.None, isStaticType: false);
616RefKind receiverRefKind,
618ImmutableArray<RefKind> refKinds,
735RefKind receiverRefKind,
737ImmutableArray<RefKind> refKinds,
751bool hasByRefs = receiverRefKind != RefKind.None || !refKinds.IsDefaultOrEmpty;
791byRefs[j++] = RefKind.None;
806static RefKind getRefKind(RefKind refKind) => refKind == RefKind.None ? RefKind.None : RefKind.Ref;
813RefKind refKind,
828Debug.Assert(refKind == RefKind.None || refKind == RefKind.Ref || refKind == RefKind.Out, "unexpected refKind in dynamic");
831if (refKind == RefKind.Out)
835else if (refKind == RefKind.Ref)
Lowering\SpillSequenceSpiller.cs (39)
306RefKind refKind = RefKind.None,
318Debug.Assert(refKind == RefKind.None);
325Debug.Assert(refKind == RefKind.None);
338if (refKind != RefKind.None)
371var left = Spill(builder, assignment.Left, RefKind.Ref);
372var right = Spill(builder, assignment.Right, RefKind.Ref);
381if (refKind != RefKind.None || expression.Type.IsReferenceType)
389if (refKind != RefKind.None)
398if (local.LocalSymbol.SynthesizedKind == SynthesizedLocalKind.Spill || refKind != RefKind.None)
411if (refKind != RefKind.None || fieldSymbol.IsReadOnly)
418if (refKind == RefKind.None) goto default;
420var receiver = Spill(builder, field.ReceiverOpt, fieldSymbol.ContainingType.IsValueType ? refKind : RefKind.None);
467Left: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.Ref } receiverRefLocal },
470ValueTypeReceiver: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.Ref } } valueTypeReceiver,
479Left: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } referenceTypeClone },
480Right: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.Ref } originalReceiverReference }
483Value: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } } referenceTypeReceiver
515ImmutableArray<RefKind> refKinds = default(ImmutableArray<RefKind>),
563var refKind = refKinds.IsDefault ? RefKind.None : refKinds[i];
821expression = Spill(leftBuilder, expression, RefKind.None);
836left = Spill(leftBuilder, VisitExpression(ref leftBuilder, left), RefKind.Ref);
868expression = Spill(leftBuilder, expression, RefKind.None);
883receiver = Spill(leftBuilder, VisitExpression(ref leftBuilder, field.ReceiverOpt), RefKind.Ref);
961RefKind refKind = ReceiverSpillRefKind(receiver);
963Debug.Assert(refKind == RefKind.None || !receiver.Type.IsReferenceType);
967if (refKind != RefKind.None &&
1000private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1002var result = RefKind.None;
1005result = receiver.Type.IsReadOnly ? RefKind.In : RefKind.Ref;
1167var receiverRefKind = ReceiverSpillRefKind(node.Receiver);
1188if (receiver.Type.IsReferenceType || receiver.Type.IsValueType || receiverRefKind == RefKind.None)
1191receiver = Spill(receiverBuilder, receiver, RefKind.None);
1208receiver = Spill(receiverBuilder, receiver, RefKind.Ref);
1210var clone = _F.SynthesizedLocal(receiver.Type, _F.Syntax, refKind: RefKind.None, kind: SynthesizedLocalKind.Spill);
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (16)
308if (local.RefKind != RefKind.None)
525var sacrificialTemp = F.SynthesizedLocal(type, refKind: RefKind.Ref);
545RefKind refKind,
555BoundExpression expression = HoistExpression(array.Expression, awaitSyntaxOpt, syntaxOffset, RefKind.None, sideEffects, hoistedFields, ref needsSacrificialEvaluation);
559indices.Add(HoistExpression(index, awaitSyntaxOpt, syntaxOffset, RefKind.None, sideEffects, hoistedFields, ref needsSacrificialEvaluation));
572if (refKind != RefKind.None || field.FieldSymbol.IsReadOnly) return expr;
576if (refKind == RefKind.None)
584isFieldOfStruct ? refKind : RefKind.None, sideEffects, hoistedFields, ref needsSacrificialEvaluation);
606if (refKind != RefKind.None && refKind != RefKind.In)
608Debug.Assert(call.Method.RefKind != RefKind.None);
612refKind = RefKind.None;
623if (refKind != RefKind.None && refKind != RefKind.RefReadOnly)
629refKind = RefKind.None;
638if (refKind != RefKind.None)
Symbols\Compilation_WellKnownMembers.cs (13)
747internal SynthesizedAttributeData? SynthesizeDynamicAttribute(TypeSymbol type, int customModifiersCount, RefKind refKindOpt = RefKind.None)
752if (type.IsDynamic() && refKindOpt == RefKind.None && customModifiersCount == 0)
861internal static ImmutableArray<TypedConstant> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount, TypeSymbol booleanType)
873internal static ImmutableArray<bool> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount)
880internal static ImmutableArray<bool> EncodeWithoutCustomModifierFlags(TypeSymbol type, RefKind refKind)
887internal static void Encode(TypeSymbol type, int customModifiersCount, RefKind refKind, ArrayBuilder<bool> transformFlagsBuilder, bool addCustomModifierFlags)
891if (refKind != RefKind.None)
982void handle(RefKind refKind, ImmutableArray<CustomModifier> customModifiers, TypeWithAnnotations twa)
989if (refKind != RefKind.None)
1144return parameter.RefKind != RefKind.None;
1149return method.RefKind != RefKind.None;
1154return property.RefKind != RefKind.None;
Symbols\FunctionPointers\FunctionPointerMethodSymbol.cs (43)
28RefKind refKind = RefKind.None;
44case SyntaxKind.RefKeyword when refKind == RefKind.None:
48refKind = RefKind.RefReadOnly;
53refKind = RefKind.Ref;
59Debug.Assert(refKind != RefKind.None);
73if (returnType.IsVoidType() && refKind != RefKind.None)
88if (refKind != RefKind.None)
247RefKind returnRefKind,
250ImmutableArray<RefKind> parameterRefKinds,
271RefKind returnRefKind,
273ImmutableArray<RefKind> parameterRefKinds,
285if (returnRefKind == RefKind.None)
310private static CustomModifier? GetCustomModifierForRefKind(RefKind refKind, CSharpCompilation compilation)
314RefKind.In => compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_InAttribute),
315RefKind.Out => compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_OutAttribute),
321Debug.Assert(refKind != RefKind.Out && refKind != RefKind.In);
349var returnVariance = RefKind == RefKind.None ? variance : VarianceKind.None;
364(VarianceKind.In, RefKind.None) => VarianceKind.Out,
365(VarianceKind.Out, RefKind.None) => VarianceKind.In,
441RefKind refKind,
486RefKind refKind,
491ImmutableArray<RefKind> parameterRefKinds,
494Debug.Assert(refKind != RefKind.Out);
495Debug.Assert(refCustomModifiers.IsDefaultOrEmpty || refKind != RefKind.None);
507Debug.Assert(refCustomModifiers.IsEmpty || refKind != RefKind.None);
511static ImmutableArray<CustomModifier> getCustomModifierArrayForRefKind(RefKind refKind, CSharpCompilation compilation)
517RefKind refKind,
551RefKind = getRefKind(retInfo, RefCustomModifiers, RefKind.RefReadOnly, RefKind.Ref);
552Debug.Assert(RefKind != RefKind.Out);
567RefKind paramRefKind = getRefKind(param, paramRefCustomMods, RefKind.In, RefKind.Out);
579static RefKind getRefKind(ParamInfo<TypeSymbol> param, ImmutableArray<CustomModifier> paramRefCustomMods, RefKind hasInRefKind, RefKind hasOutRefKind)
583false => RefKind.None,
586true => RefKind.Ref,
645var modifiersToSearch = RefKind != RefKind.None ? RefCustomModifiers : ReturnTypeWithAnnotations.CustomModifiers;
668var modifiersToSearch = RefKind != RefKind.None ? RefCustomModifiers : ReturnTypeWithAnnotations.CustomModifiers;
764public override RefKind RefKind { get; }
Symbols\Source\ParameterHelpers.cs (29)
41ParameterSyntax syntax, RefKind refKind, int ordinal,
81FunctionPointerParameterSyntax syntax, RefKind refKind, int ordinal,
91RefKind.In => CreateInModifiers(binder, diagnostics, syntax),
92RefKind.Out => CreateOutModifiers(binder, diagnostics, syntax),
122Func<Binder, TOwningSymbol, TypeWithAnnotations, TParameterSyntax, RefKind, int, SyntaxToken, SyntaxToken, bool, ScopedKind, BindingDiagnosticBag, TParameterSymbol> parameterCreationFunc,
142var refKind = GetModifiers(parameterSyntax.Modifiers, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out ScopedKind scope);
181if (!allowRefOrOut && (refKind == RefKind.Ref || refKind == RefKind.Out))
240if (parameter.RefKind == RefKind.In)
317internal static bool IsRefScopedByDefault(bool useUpdatedEscapeRules, RefKind refKind)
319return useUpdatedEscapeRules && refKind == RefKind.Out;
615RefKind refKind,
659else if (refKind != RefKind.None &&
713var refKind = GetModifiers(parameterSyntax.Modifiers, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out _);
719if (refKind == RefKind.Ref || refKind == RefKind.Out)
888internal static RefKind GetModifiers(SyntaxTokenList modifiers, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out ScopedKind scope)
890var refKind = RefKind.None;
902if (refKind == RefKind.None)
905refKind = RefKind.Out;
909if (refKind == RefKind.None)
912refKind = RefKind.Ref;
916if (refKind == RefKind.None)
919refKind = RefKind.In;
929Debug.Assert(refKind == RefKind.None);
937scope = (refKind == RefKind.None) ? ScopedKind.ScopedValue : ScopedKind.ScopedRef;
947internal static ImmutableArray<CustomModifier> ConditionallyCreateInModifiers(RefKind refKind, bool addRefReadOnlyModifier, Binder binder, BindingDiagnosticBag diagnostics, SyntaxNode syntax)
949if (addRefReadOnlyModifier && refKind == RefKind.In)
Symbols\Source\SourceDelegateMethodSymbol.cs (17)
52returnTypeSyntax = returnTypeSyntax.SkipScoped(out _).SkipRefInLocalOrReturn(diagnostics, out RefKind refKind);
225SynthesizedParameterSymbol.Create(this, objectType, 0, RefKind.None, "object"),
226SynthesizedParameterSymbol.Create(this, intPtrType, 1, RefKind.None, "method")));
234public override RefKind RefKind
236get { return RefKind.None; }
261private readonly RefKind _refKind;
266RefKind refKind,
291if (_refKind == RefKind.RefReadOnly)
309public override RefKind RefKind
335if (_refKind == RefKind.RefReadOnly)
380parameters.Add(SynthesizedParameterSymbol.Create(this, asyncCallbackType, paramCount, RefKind.None, GetUniqueParameterName(parameters, "callback")));
381parameters.Add(SynthesizedParameterSymbol.Create(this, objectType, paramCount + 1, RefKind.None, GetUniqueParameterName(parameters, "object")));
391public override RefKind RefKind
393get { return RefKind.None; }
422if (p.RefKind != RefKind.None)
429parameters.Add(SynthesizedParameterSymbol.Create(this, iAsyncResultType, ordinal++, RefKind.None, GetUniqueParameterName(parameters, "result")));
437public override RefKind RefKind => _invoke.RefKind;
Symbols\Source\SourceMemberContainerSymbol.cs (18)
2055var refKind1 = method1.Parameters[i].RefKind;
2056var refKind2 = method2.Parameters[i].RefKind;
3683if (methodParam.RefKind != RefKind.None)
3706methodParams[0].RefKind == RefKind.None &&
4030RefKind.Out
4032RefKind.None,
4077RefKind.None
4079RefKind.None,
4125RefKind.None)),
4126RefKind.None,
4181RefKind.None,
4262RefKind.None,
4355RefKind.None,
4386RefKind.None,
4451RefKind.None
4453RefKind.None,
4650_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
4659var modifiers = SourceMemberFieldSymbol.MakeModifiers(this, fieldSyntax.Declaration.Variables[0].Identifier, fieldSyntax.Modifiers, isRefField: refKind != RefKind.None, diagnostics, out modifierErrors);
Symbols\Synthesized\Records\SynthesizedRecordDeconstruct.cs (1)
48RefKind.Out,
Symbols\Synthesized\Records\SynthesizedRecordEqualityContractProperty.cs (1)
37RefKind.None,
Symbols\Synthesized\Records\SynthesizedRecordPropertySymbol.cs (1)
34RefKind.None,
Symbols\Synthesized\RefKindVector.cs (9)
38internal RefKind this[int index]
45(false, false) => RefKind.None,
46(false, true) => RefKind.Ref,
47(true, false) => RefKind.Out,
48(true, true) => RefKind.RefReadOnly,
56RefKind.None => (false, false),
57RefKind.Ref => (false, true),
58RefKind.Out => (true, false),
59RefKind.RefReadOnly => (true, true),
Symbols\Synthesized\SynthesizedDelegateSymbol.cs (6)
21SynthesizedParameterSymbol.Create(this, TypeWithAnnotations.Create(objectType), 0, RefKind.None, "object"),
22SynthesizedParameterSymbol.Create(this, TypeWithAnnotations.Create(intPtrType), 1, RefKind.None, "method"));
35internal ParameterDescription(TypeWithAnnotations type, RefKind refKind, ScopedKind scope, ConstantValue? defaultValue, bool isParams, bool hasUnscopedRefAttribute)
46internal readonly RefKind RefKind;
59RefKind refKind)
163public override RefKind RefKind { get; }
Symbols\Synthesized\SynthesizedEntryPointSymbol.cs (10)
115public override RefKind RefKind
117get { return RefKind.None; }
299default(ImmutableArray<RefKind>),
350argumentRefKindsOpt: default(ImmutableArray<RefKind>),
398refKind: RefKind.None,
416refKind: RefKind.None,
509RefKind.None,
528TypeWithAnnotations.Create(submissionArrayType), 0, RefKind.None, "submissionArray"));
579argumentRefKindsOpt: default(ImmutableArray<RefKind>),
599RefKind.None,
Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.ExpressionCompiler.UnitTests (2)
GenerateMember\GenerateParameterizedMember\AbstractGenerateDeconstructMethodService.State.cs (1)
81refKind: RefKind.None,
GenerateMember\GenerateVariable\AbstractGenerateVariableService.cs (8)
155document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None, fallbackOptions));
169document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None, fallbackOptions));
183document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None, fallbackOptions));
231parameter.RefKind is RefKind.Out ||
256private static RefKind GetRefKindFromContext(State state)
260return RefKind.Ref;
264return RefKind.RefReadOnly;
268return RefKind.None;
GenerateMember\GenerateVariable\AbstractGenerateVariableService.GenerateParameterCodeAction.cs (1)
50RefKind.None,
InitializeParameter\AbstractInitializeMemberFromParameterCodeRefactoringProviderMemberCreation.cs (1)
363RefKind.None,
Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator.ExpressionCompiler.UnitTests (1)