diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Deconstruct.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Deconstruct.cs index c228e12d03411..70390a2a15383 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Deconstruct.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Deconstruct.cs @@ -409,9 +409,10 @@ private void FailRemainingInferencesAndSetValEscape(ArrayBuilder diff --git a/src/Compilers/CSharp/Portable/BoundTree/VariablePendingInference.cs b/src/Compilers/CSharp/Portable/BoundTree/VariablePendingInference.cs index 8878d81a9e9af..9032d4d2572da 100644 --- a/src/Compilers/CSharp/Portable/BoundTree/VariablePendingInference.cs +++ b/src/Compilers/CSharp/Portable/BoundTree/VariablePendingInference.cs @@ -63,6 +63,12 @@ internal BoundExpression SetInferredTypeWithAnnotations(TypeWithAnnotations type this.Syntax; Binder.CheckRestrictedTypeInAsyncMethod(localSymbol.ContainingSymbol, type.Type, diagnosticsOpt, typeOrDesignationSyntax); + + if (localSymbol.Scope == DeclarationScope.ValueScoped && !type.Type.IsErrorTypeOrRefLikeType()) + { + diagnosticsOpt.Add(ErrorCode.ERR_ScopedRefAndRefStructOnly, + (typeOrDesignationSyntax is TypeSyntax typeSyntax ? typeSyntax.SkipScoped(out _).SkipRef(out _) : typeOrDesignationSyntax).Location); + } } } diff --git a/src/Compilers/CSharp/Portable/CSharpResources.resx b/src/Compilers/CSharp/Portable/CSharpResources.resx index dec462da992d5..118eca70624bf 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.resx +++ b/src/Compilers/CSharp/Portable/CSharpResources.resx @@ -7367,4 +7367,10 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ 'readonly' is not supported as a parameter modifier. Did you mean 'in'? + + The 'scoped' modifier cannot be used with discard. + + + A deconstruction variable cannot be declared as a ref local + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs index d865e71511cbc..651c4a97d6123 100644 --- a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs @@ -366,7 +366,7 @@ private Symbol GetSemanticInfoSymbolInNonMemberContext(CSharpSyntaxNode node, bo // However, we can return fieldSymbol.Type for implicitly typed field symbols in both cases. // Note that for regular C#, fieldSymbol.Type would be an error type. - var variableDecl = type.Parent as VariableDeclarationSyntax; + var variableDecl = type.ModifyingScopedOrRefTypeOrSelf().Parent as VariableDeclarationSyntax; if (variableDecl != null && variableDecl.Variables.Any()) { var fieldSymbol = GetDeclaredFieldSymbol(variableDecl.Variables.First()); diff --git a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs index 67a38cd339ae9..0db73a0f50ad6 100644 --- a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs +++ b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs @@ -2112,7 +2112,7 @@ internal enum ErrorCode ERR_FeatureNotAvailableInVersion11 = 9058, ERR_RefFieldInNonRefStruct = 9059, ERR_CannotMatchOnINumberBase = 9060, - // Available 9061, + ERR_ScopedDiscard = 9061, ERR_ScopedTypeNameDisallowed = 9062, ERR_UnscopedRefAttributeUnsupportedTarget = 9063, ERR_RuntimeDoesNotSupportRefFields = 9064, @@ -2123,7 +2123,7 @@ internal enum ErrorCode ERR_FilePathCannotBeConvertedToUtf8 = 9069, ERR_ReadOnlyNotSuppAsParamModDidYouMeanIn = 9070, ERR_FileLocalDuplicateNameInNS = 9071, - // Available 9072, + ERR_DeconstructVariableCannotBeByRef = 9072, WRN_ScopedMismatchInParameterOfTarget = 9073, WRN_ScopedMismatchInParameterOfOverrideOrImplementation = 9074, ERR_RefReturnScopedParameter = 9075, diff --git a/src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs b/src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs index 26b501768be40..1673e73992a53 100644 --- a/src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs +++ b/src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs @@ -1819,6 +1819,7 @@ internal static bool IsBuildOnlyDiagnostic(ErrorCode code) case ErrorCode.ERR_InvalidObjectCreation: case ErrorCode.WRN_TypeParameterSameAsOuterMethodTypeParameter: case ErrorCode.ERR_OutVariableCannotBeByRef: + case ErrorCode.ERR_DeconstructVariableCannotBeByRef: case ErrorCode.ERR_OmittedTypeArgument: case ErrorCode.ERR_FeatureNotAvailableInVersion8: case ErrorCode.ERR_AltInterpolatedVerbatimStringsNotAvailable: @@ -2218,6 +2219,7 @@ internal static bool IsBuildOnlyDiagnostic(ErrorCode code) case ErrorCode.ERR_BadAbstractEqualityOperatorSignature: case ErrorCode.ERR_BadBinaryReadOnlySpanConcatenation: case ErrorCode.ERR_ScopedRefAndRefStructOnly: + case ErrorCode.ERR_ScopedDiscard: case ErrorCode.ERR_FixedFieldMustNotBeRef: case ErrorCode.ERR_RefFieldCannotReferToRefStruct: case ErrorCode.ERR_FileTypeDisallowedInSignature: diff --git a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs index 226fdea5cc584..d364f29da881e 100644 --- a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs +++ b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs @@ -9261,7 +9261,7 @@ private CommonForEachStatementSyntax ParseForEachStatement( var openParen = this.EatToken(SyntaxKind.OpenParenToken); - var variable = ParseExpressionOrDeclaration(ParseTypeMode.Normal, feature: MessageID.IDS_FeatureTuples, permitTupleDesignation: true, permitScoped: true); + var variable = ParseExpressionOrDeclaration(ParseTypeMode.Normal, feature: MessageID.IDS_FeatureTuples, permitTupleDesignation: true); var @in = this.EatToken(SyntaxKind.InKeyword, ErrorCode.ERR_InExpected); if (!IsValidForeachVariable(variable)) { @@ -9338,17 +9338,17 @@ private CommonForEachStatementSyntax ParseForEachStatement( // // See also ScanTypeArgumentList where these disambiguation rules are encoded. // - private ExpressionSyntax ParseExpressionOrDeclaration(ParseTypeMode mode, MessageID feature, bool permitTupleDesignation, bool permitScoped) + private ExpressionSyntax ParseExpressionOrDeclaration(ParseTypeMode mode, MessageID feature, bool permitTupleDesignation) { bool isScoped; - return IsPossibleDeclarationExpression(mode, permitTupleDesignation, permitScoped, out isScoped) + return IsPossibleDeclarationExpression(mode, permitTupleDesignation, out isScoped) ? this.ParseDeclarationExpression(mode, feature, isScoped) : this.ParseSubExpression(Precedence.Expression); } - private bool IsPossibleDeclarationExpression(ParseTypeMode mode, bool permitTupleDesignation, bool permitScoped, out bool isScoped) + private bool IsPossibleDeclarationExpression(ParseTypeMode mode, bool permitTupleDesignation, out bool isScoped) { - Debug.Assert(mode == ParseTypeMode.Normal || !permitScoped); + Debug.Assert(mode is ParseTypeMode.Normal or ParseTypeMode.FirstElementOfPossibleTupleLiteral or ParseTypeMode.AfterTupleComma); isScoped = false; if (this.IsInAsync && this.CurrentToken.ContextualKind == SyntaxKind.AwaitKeyword) @@ -9360,13 +9360,35 @@ private bool IsPossibleDeclarationExpression(ParseTypeMode mode, bool permitTupl var resetPoint = this.GetResetPoint(); try { - if (permitScoped && this.CurrentToken.ContextualKind == SyntaxKind.ScopedKeyword && mode == ParseTypeMode.Normal) + if (this.CurrentToken.ContextualKind == SyntaxKind.ScopedKeyword) { this.EatToken(); if (ScanType() != ScanTypeFlags.NotType && this.CurrentToken.Kind == SyntaxKind.IdentifierToken) { - isScoped = true; - return true; + switch (mode) + { + case ParseTypeMode.FirstElementOfPossibleTupleLiteral: + if (this.PeekToken(1).Kind == SyntaxKind.CommaToken) + { + isScoped = true; + return true; + } + break; + + case ParseTypeMode.AfterTupleComma: + if (this.PeekToken(1).Kind is SyntaxKind.CommaToken or SyntaxKind.CloseParenToken) + { + isScoped = true; + return true; + } + break; + + default: + // The other case where we disambiguate between a declaration and expression is before the `in` of a foreach loop. + // There we err on the side of accepting a declaration. + isScoped = true; + return true; + } } this.Reset(ref resetPoint); @@ -11805,7 +11827,7 @@ private ArgumentSyntax ParseArgumentExpression(bool isIndexer) // that the ref/out of the argument must match the parameter when binding the argument list. expression = (refKindKeyword?.Kind == SyntaxKind.OutKeyword) - ? ParseExpressionOrDeclaration(ParseTypeMode.Normal, feature: MessageID.IDS_FeatureOutVar, permitTupleDesignation: false, permitScoped: false) + ? ParseExpressionOrDeclaration(ParseTypeMode.Normal, feature: MessageID.IDS_FeatureOutVar, permitTupleDesignation: false) : ParseSubExpression(Precedence.Expression); } @@ -12108,7 +12130,7 @@ private ExpressionSyntax ParseCastOrParenExpressionOrTuple() { this.Reset(ref resetPoint); var openParen = this.EatToken(SyntaxKind.OpenParenToken); - var expression = this.ParseExpressionOrDeclaration(ParseTypeMode.FirstElementOfPossibleTupleLiteral, feature: 0, permitTupleDesignation: true, permitScoped: false); + var expression = this.ParseExpressionOrDeclaration(ParseTypeMode.FirstElementOfPossibleTupleLiteral, feature: 0, permitTupleDesignation: true); // ( , must be a tuple if (this.CurrentToken.Kind == SyntaxKind.CommaToken) @@ -12121,7 +12143,7 @@ private ExpressionSyntax ParseCastOrParenExpressionOrTuple() if (expression.Kind == SyntaxKind.IdentifierName && this.CurrentToken.Kind == SyntaxKind.ColonToken) { var nameColon = _syntaxFactory.NameColon((IdentifierNameSyntax)expression, EatToken()); - expression = this.ParseExpressionOrDeclaration(ParseTypeMode.FirstElementOfPossibleTupleLiteral, feature: 0, permitTupleDesignation: true, permitScoped: false); + expression = this.ParseExpressionOrDeclaration(ParseTypeMode.FirstElementOfPossibleTupleLiteral, feature: 0, permitTupleDesignation: true); var firstArg = _syntaxFactory.Argument(nameColon, refKindKeyword: null, expression: expression); return ParseTupleExpressionTail(openParen, firstArg); @@ -12151,11 +12173,11 @@ private TupleExpressionSyntax ParseTupleExpressionTail(SyntaxToken openParen, Ar ArgumentSyntax arg; - var expression = ParseExpressionOrDeclaration(ParseTypeMode.AfterTupleComma, feature: 0, permitTupleDesignation: true, permitScoped: false); + var expression = ParseExpressionOrDeclaration(ParseTypeMode.AfterTupleComma, feature: 0, permitTupleDesignation: true); if (expression.Kind == SyntaxKind.IdentifierName && this.CurrentToken.Kind == SyntaxKind.ColonToken) { var nameColon = _syntaxFactory.NameColon((IdentifierNameSyntax)expression, EatToken()); - expression = ParseExpressionOrDeclaration(ParseTypeMode.AfterTupleComma, feature: 0, permitTupleDesignation: true, permitScoped: false); + expression = ParseExpressionOrDeclaration(ParseTypeMode.AfterTupleComma, feature: 0, permitTupleDesignation: true); arg = _syntaxFactory.Argument(nameColon, refKindKeyword: null, expression: expression); } else diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/GlobalExpressionVariable.cs b/src/Compilers/CSharp/Portable/Symbols/Source/GlobalExpressionVariable.cs index 8a5c5e2e550b6..d78dc829742e3 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/GlobalExpressionVariable.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/GlobalExpressionVariable.cs @@ -50,7 +50,7 @@ internal static GlobalExpressionVariable Create( Debug.Assert(nodeToBind.Kind() == SyntaxKind.VariableDeclarator || nodeToBind is ExpressionSyntax); var syntaxReference = syntax.GetReference(); - return (typeSyntax == null || typeSyntax.IsVar) + return (typeSyntax == null || typeSyntax.SkipScoped(out _).SkipRef(out _).IsVar) ? new InferrableGlobalExpressionVariable(containingType, modifiers, typeSyntax, name, syntaxReference, location, containingFieldOpt, nodeToBind) : new GlobalExpressionVariable(containingType, modifiers, typeSyntax, name, syntaxReference, location); } @@ -88,7 +88,7 @@ internal override TypeWithAnnotations GetFieldType(ConsList fieldsB if (typeSyntax != null) { - type = binder.BindTypeOrVarKeyword(typeSyntax, diagnostics, out isVar); + type = binder.BindTypeOrVarKeyword(typeSyntax.SkipScoped(out _).SkipRef(out _), diagnostics, out isVar); } else { diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceLocalSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceLocalSymbol.cs index 002b908cc7fb2..b67397afd9e6a 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceLocalSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceLocalSymbol.cs @@ -208,11 +208,9 @@ public static SourceLocalSymbol MakeDeconstructionLocal( Debug.Assert(closestTypeSyntax != null); Debug.Assert(nodeBinder != null); - Debug.Assert(closestTypeSyntax.Kind() != SyntaxKind.RefType); - // https://github.com/dotnet/roslyn/issues/62039: Allow 'scoped' modifier. - return closestTypeSyntax.IsVar + return closestTypeSyntax.SkipScoped(out _).SkipRef(out _).IsVar ? new DeconstructionLocalSymbol(containingSymbol, scopeBinder, nodeBinder, closestTypeSyntax, identifierToken, kind, deconstruction) - : new SourceLocalSymbol(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: false, closestTypeSyntax, identifierToken, kind); + : new SourceLocalSymbol(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: true, closestTypeSyntax, identifierToken, kind); } /// @@ -241,10 +239,9 @@ internal static LocalSymbol MakeLocalSymbolWithEnclosingContext( Contains(nodeToBind.Ancestors().OfType().First().Kind()) || nodeToBind is ExpressionSyntax); Debug.Assert(!(nodeToBind.Kind() == SyntaxKind.SwitchExpressionArm) || nodeBinder is SwitchExpressionArmBinder); - // https://github.com/dotnet/roslyn/issues/62039: Allow 'scoped' modifier. - return typeSyntax?.IsVar != false && kind != LocalDeclarationKind.DeclarationExpressionVariable + return typeSyntax?.SkipScoped(out _).SkipRef(out _).IsVar != false && kind != LocalDeclarationKind.DeclarationExpressionVariable ? new LocalSymbolWithEnclosingContext(containingSymbol, scopeBinder, nodeBinder, typeSyntax, identifierToken, kind, nodeToBind, forbiddenZone) - : new SourceLocalSymbol(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: false, typeSyntax, identifierToken, kind); + : new SourceLocalSymbol(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: true, typeSyntax, identifierToken, kind); } /// @@ -741,7 +738,7 @@ public DeconstructionLocalSymbol( SyntaxToken identifierToken, LocalDeclarationKind declarationKind, SyntaxNode deconstruction) - : base(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: false, typeSyntax, identifierToken, declarationKind) // https://github.com/dotnet/roslyn/issues/62039: Allow 'scoped' modifier. + : base(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: true, typeSyntax, identifierToken, declarationKind) { _deconstruction = deconstruction; _nodeBinder = nodeBinder; @@ -806,7 +803,7 @@ public LocalSymbolWithEnclosingContext( LocalDeclarationKind declarationKind, SyntaxNode nodeToBind, SyntaxNode forbiddenZone) - : base(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: false, typeSyntax, identifierToken, declarationKind) // https://github.com/dotnet/roslyn/issues/62039: Allow 'scoped' modifier. + : base(containingSymbol, scopeBinder, allowRefKind: false, allowScoped: true, typeSyntax, identifierToken, declarationKind) { Debug.Assert( nodeToBind.Kind() == SyntaxKind.CasePatternSwitchLabel || diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs index 16e6956248e7e..56f4c4dd46fcc 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs @@ -507,8 +507,8 @@ private TypeAndRefKind GetTypeAndRefKind(ConsList fieldsBeingBound) else { bool isVar; - type = binder.BindTypeOrVarKeyword(typeSyntax, diagnostics, out isVar); - + type = binder.BindTypeOrVarKeyword(typeSyntax.SkipScoped(out _).SkipRef(out RefKind refKindToAssert), diagnostics, out isVar); + Debug.Assert(refKindToAssert == RefKind.None); // Otherwise we might need to report an error Debug.Assert(type.HasType || isVar); if (isVar) diff --git a/src/Compilers/CSharp/Portable/Syntax/SyntaxFacts.cs b/src/Compilers/CSharp/Portable/Syntax/SyntaxFacts.cs index c561a1cc4abfa..f54710372b369 100644 --- a/src/Compilers/CSharp/Portable/Syntax/SyntaxFacts.cs +++ b/src/Compilers/CSharp/Portable/Syntax/SyntaxFacts.cs @@ -448,8 +448,8 @@ internal static bool IsIdentifierVarOrPredefinedType(this Syntax.InternalSyntax. internal static bool IsDeclarationExpressionType(SyntaxNode node, [NotNullWhen(true)] out DeclarationExpressionSyntax? parent) { - parent = node.Parent as DeclarationExpressionSyntax; - return node == parent?.Type; + parent = node.ModifyingScopedOrRefTypeOrSelf().Parent as DeclarationExpressionSyntax; + return node == parent?.Type.SkipScoped(out _).SkipRef(out _); } /// diff --git a/src/Compilers/CSharp/Portable/Syntax/SyntaxNodeExtensions.cs b/src/Compilers/CSharp/Portable/Syntax/SyntaxNodeExtensions.cs index f23d077149281..fd12f93560824 100644 --- a/src/Compilers/CSharp/Portable/Syntax/SyntaxNodeExtensions.cs +++ b/src/Compilers/CSharp/Portable/Syntax/SyntaxNodeExtensions.cs @@ -255,6 +255,24 @@ internal static TypeSyntax SkipScoped(this TypeSyntax syntax, out bool isScoped) return syntax; } + internal static SyntaxNode ModifyingScopedOrRefTypeOrSelf(this SyntaxNode syntax) + { + SyntaxNode? parentNode = syntax.Parent; + + if (parentNode is RefTypeSyntax refType && refType.Type == syntax) + { + syntax = refType; + parentNode = parentNode.Parent; + } + + if (parentNode is ScopedTypeSyntax scopedType && scopedType.Type == syntax) + { + return scopedType; + } + + return syntax; + } + internal static ExpressionSyntax? CheckAndUnwrapRefExpression( this ExpressionSyntax? syntax, BindingDiagnosticBag diagnostics, diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf index 516549d490b07..9c7f444cff8d8 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf @@ -362,6 +362,11 @@ Název {0} neodpovídá příslušnému parametru Deconstruct {1}. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. Omezení default je platné jen v přepsaných metodách a metodách explicitní implementace rozhraní. @@ -1412,6 +1417,11 @@ Cílový modul runtime nepodporuje rozšiřitelné konvence volání ani konvence volání výchozí pro prostředí modulu runtime. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Modifikátor scoped parametru {0} neodpovídá přepsanému nebo implementovanému členu. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf index bef87b4ee3870..a4ac2555e40ab 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf @@ -362,6 +362,11 @@ Der Name "{0}" stimmt nicht mit dem entsprechenden Deconstruct-Parameter "{1}" überein. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. Die default-Einschränkung ist nur für Überschreibungsmethoden und Methoden zur expliziten Schnittstellenimplementierung gültig. @@ -1412,6 +1417,11 @@ Die Zielruntime unterstützt keine erweiterbaren Aufrufkonventionen oder Standardaufrufkonventionen der Runtime-Umgebung. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Der Modifikator ‚Scoped‘ des Parameters ‚{0}‘ stimmt nicht mit dem überschriebenen oder implementierten Member überein. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf index ac4904a9b63e3..0a076c0adc4e6 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf @@ -362,6 +362,11 @@ El nombre "{0}" no coincide con el parámetro de "Deconstruct" correspondiente, "{1}". + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. La restricción "default" solo es válida en los métodos de invalidación y de implementación de interfaz explícita. @@ -1412,6 +1417,11 @@ El entorno de ejecución de destino no admite convenciones de llamada predeterminadas de entorno en tiempo de ejecución o extensible. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. El modificador 'scoped' del parámetro '{0}' no coincide con el miembro invalidado o implementado. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf index 39c443c7b8086..8c4dca7b80e1a 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf @@ -362,6 +362,11 @@ Le nom '{0}' ne correspond pas au paramètre 'Deconstruct' correspondant '{1}'. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. La contrainte 'default' est uniquement valide sur les méthodes de substitution et d'implémentation d'interface explicite. @@ -1412,6 +1417,11 @@ Le runtime cible ne prend pas en charge les conventions d'appel par défaut des environnements extensibles ou d'exécution. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Le modificateur 'scoped' du paramètre '{0}' ne correspond pas au membre substitué ou implémenté. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf index d1db246c53d01..7075509fb07a8 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf @@ -362,6 +362,11 @@ Il nome '{0}' non corrisponde al parametro '{1}' di 'Deconstruct' corrispondente. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. Il vincolo 'default' è valido solo in metodi di override e di implementazione esplicita dell'interfaccia. @@ -1412,6 +1417,11 @@ Il runtime di destinazione non supporta convenzioni di chiamata predefinite estendibili o dell'ambiente di runtime. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Il modificatore 'scoped' del parametro '{0}' non corrisponde al membro sottoposto a override o implementato. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf index 1007837d98407..a1fb74760bb4d 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf @@ -362,6 +362,11 @@ 名前 '{0}' は対応する 'Deconstruct' パラメーター '{1}' と一致しません。 + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. 'default' 制約は、オーバーライドおよび明示的なインターフェイスの実装メソッドでのみ有効です。 @@ -1412,6 +1417,11 @@ ターゲット ランタイムは、拡張可能またはランタイム環境の既定の呼び出し規則をサポートしていません。 + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. パラメーター '{0}' の 'scoped' 修飾子が、オーバーライドされたメンバーまたは実装されたメンバーと一致しません。 diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf index 88435c623e945..5d648679069ff 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf @@ -362,6 +362,11 @@ '{0}' 이름이 해당 'Deconstruct' 매개 변수 '{1}'과(와) 일치하지 않습니다. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. 'default' 제약 조건은 재정의 및 명시적 인터페이스 구현 메서드에만 유효합니다. @@ -1412,6 +1417,11 @@ 대상 런타임에서 확장 가능 또는 런타임 환경 기본 호출 규칙을 지원하지 않습니다. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. 매개 변수 '{0}'의 '범위' 수정자가 재정의되거나 구현된 멤버와 일치하지 않습니다. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf index 0ae63c686053e..b4a1dd3a238e0 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf @@ -362,6 +362,11 @@ Nazwa „{0}” nie jest zgodna z odpowiednim parametrem „Deconstruct” „{1}”. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. Ograniczenie „default” jest prawidłowe tylko w przypadku ograniczenia dla przesłoniętych i jawnych metod implementacji interfejsu. @@ -1412,6 +1417,11 @@ Docelowe środowisko uruchomieniowe nie obsługuje rozszerzalnych ani domyślnych dla środowiska uruchomieniowego konwencji wywoływania. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Modyfikator „scoped” parametru „{0}” nie jest zgodny z przesłoniętą lub zaimplementowaną składową. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf index 8640c2566a35e..c7ad97abbe629 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf @@ -362,6 +362,11 @@ O nome '{0}' não corresponde ao parâmetro 'Deconstruct' '{1}'. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. A restrição 'default' é válida somente nos métodos de substituição e de implementação explícita da interface. @@ -1412,6 +1417,11 @@ O runtime de destino não dá suporte a convenções de chamada padrão extensíveis ou de ambiente de runtime. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. O modificador 'scoped' do parâmetro '{0}' não corresponde ao membro substituído ou implementado. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf index 996552c994ec2..1db5ef7176905 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf @@ -362,6 +362,11 @@ Имя "{0}" не соответствует указанному параметру "Deconstruct" "{1}". + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. Ограничение "default" допустимо только для переопределенных и явных методов реализации интерфейса. @@ -1412,6 +1417,11 @@ Целевая среда выполнения не поддерживает расширяемые или принадлежащие среде выполнения соглашения о вызовах по умолчанию. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. Модификатор "scoped" параметра "{0}" не совпадает с переопределенным или реализованным членом. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf index 7509a662e24b1..f072ac8219c82 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf @@ -362,6 +362,11 @@ '{0}' adı ilgili '{1}' 'Deconstruct' parametresiyle eşleşmiyor. + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. 'default' kısıtlaması yalnızca geçersiz kılma ve açık arabirim uygulama metotlarında geçerlidir. @@ -1412,6 +1417,11 @@ Hedef çalışma zamanı, genişletilebilir veya çalışma zamanı ortamı varsayılanı çağırma kurallarını desteklemiyor. + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. '{0}' parametresinin 'scoped' değiştiricisi geçersiz kılınan veya uygulanan üyeyle eşleşmiyor. diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf index a39233ccaf0ae..51ef02eccbbd5 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf @@ -362,6 +362,11 @@ 名称“{0}”与相应 "Deconstruct" 参数“{1}”不匹配。 + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. "default" 约束仅针对替代和显式接口实现方法有效。 @@ -1412,6 +1417,11 @@ 目标运行时不支持可扩展或运行时环境默认调用约定。 + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. 参数 "{0}" 的 "scoped" 修饰符与被重写或实现的成员不匹配。 diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf index b46dd1fc3ee63..253753842d957 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf @@ -362,6 +362,11 @@ 名稱 '{0}' 與對應的 'Deconstruct' 參數 '{1}' 不相符。 + + A deconstruction variable cannot be declared as a ref local + A deconstruction variable cannot be declared as a ref local + + The 'default' constraint is valid on override and explicit interface implementation methods only. 'default' 條件約束只在覆寫和明確介面實作方法上有效。 @@ -1412,6 +1417,11 @@ 目標執行階段不支援可延伸或執行階段環境的預設呼叫慣例。 + + The 'scoped' modifier cannot be used with discard. + The 'scoped' modifier cannot be used with discard. + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. 參數 '{0}' 的 'scoped' 修飾元不符合覆寫或實作的成員。 diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RefEscapingTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RefEscapingTests.cs index ee93d4e81f32c..a458af53e721c 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RefEscapingTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RefEscapingTests.cs @@ -5208,37 +5208,42 @@ static RS M2(ref RS rs5) M0(ref rs5, out scoped RS rs6); return rs6; // 2 } + + static RS M12(ref RS rs3) + { + // RSTE of rs3 is ReturnOnly. + // However, since rs4 is 'scoped', its STE should be narrowed to CurrentMethod + scoped RS rs4; + M0(ref rs3, out rs4); + return rs4; // 3 + } + + static RS M22(ref RS rs5) + { + // RSTE of rs5 is ReturnOnly. + // However, since rs6 is 'scoped', its STE should be narrowed to CurrentMethod + scoped RS rs6; + M0(ref rs5, out rs6); + return rs6; // 4 + } } """; - // Once 'out scoped var' support is added, this test baseline should be updated. - // https://github.com/dotnet/roslyn/issues/64556 var comp = CreateCompilation(source); comp.VerifyDiagnostics( - // (18,25): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) - // M0(ref rs3, out scoped var rs4); - Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(18, 25), - // (18,36): error CS1003: Syntax error, ',' expected - // M0(ref rs3, out scoped var rs4); - Diagnostic(ErrorCode.ERR_SyntaxError, "rs4").WithArguments(",").WithLocation(18, 36), - // (18,36): error CS0103: The name 'rs4' does not exist in the current context - // M0(ref rs3, out scoped var rs4); - Diagnostic(ErrorCode.ERR_NameNotInContext, "rs4").WithArguments("rs4").WithLocation(18, 36), - // (19,16): error CS0103: The name 'rs4' does not exist in the current context + // (19,16): error CS8352: Cannot use variable 'rs4' in this context because it may expose referenced variables outside of their declaration scope // return rs4; // 1 - Diagnostic(ErrorCode.ERR_NameNotInContext, "rs4").WithArguments("rs4").WithLocation(19, 16), - // (26,25): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) - // M0(ref rs5, out scoped RS rs6); - Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(26, 25), - // (26,35): error CS1003: Syntax error, ',' expected - // M0(ref rs5, out scoped RS rs6); - Diagnostic(ErrorCode.ERR_SyntaxError, "rs6").WithArguments(",").WithLocation(26, 35), - // (26,35): error CS0103: The name 'rs6' does not exist in the current context - // M0(ref rs5, out scoped RS rs6); - Diagnostic(ErrorCode.ERR_NameNotInContext, "rs6").WithArguments("rs6").WithLocation(26, 35), - // (27,16): error CS0103: The name 'rs6' does not exist in the current context + Diagnostic(ErrorCode.ERR_EscapeVariable, "rs4").WithArguments("rs4").WithLocation(19, 16), + // (27,16): error CS8352: Cannot use variable 'rs6' in this context because it may expose referenced variables outside of their declaration scope // return rs6; // 2 - Diagnostic(ErrorCode.ERR_NameNotInContext, "rs6").WithArguments("rs6").WithLocation(27, 16)); + Diagnostic(ErrorCode.ERR_EscapeVariable, "rs6").WithArguments("rs6").WithLocation(27, 16), + // (36,16): error CS8352: Cannot use variable 'rs4' in this context because it may expose referenced variables outside of their declaration scope + // return rs4; // 3 + Diagnostic(ErrorCode.ERR_EscapeVariable, "rs4").WithArguments("rs4").WithLocation(36, 16), + // (45,16): error CS8352: Cannot use variable 'rs6' in this context because it may expose referenced variables outside of their declaration scope + // return rs6; // 4 + Diagnostic(ErrorCode.ERR_EscapeVariable, "rs6").WithArguments("rs6").WithLocation(45, 16) + ); } } } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RefFieldTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RefFieldTests.cs index 377b236e7f56f..5e287bf9350e1 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RefFieldTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RefFieldTests.cs @@ -10479,6 +10479,9 @@ static void F(ref R r) scoped R r1 = default; scoped ref R r2 = ref r; scoped ref readonly R r5 = ref r; + scoped var r11 = (R)default; + scoped ref var r21 = ref r; + scoped ref readonly var r51 = ref r; } }"; var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); @@ -10491,7 +10494,17 @@ static void F(ref R r) Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(8, 9), // (9,9): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. // scoped ref readonly R r5 = ref r; - Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(9, 9)); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(9, 9), + // (10,9): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // scoped var r11 = (R)default; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(10, 9), + // (11,9): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // scoped ref var r21 = ref r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(11, 9), + // (12,9): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // scoped ref readonly var r51 = ref r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(12, 9) + ); verify(comp); comp = CreateCompilation(source); @@ -10508,15 +10521,97 @@ static void verify(CSharpCompilation comp) VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); VerifyLocalSymbol(locals[1], "scoped ref R r2", RefKind.Ref, DeclarationScope.RefScoped); VerifyLocalSymbol(locals[2], "scoped ref readonly R r5", RefKind.RefReadOnly, DeclarationScope.RefScoped); + VerifyLocalSymbol(locals[3], "scoped R r11", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[4], "scoped ref R r21", RefKind.Ref, DeclarationScope.RefScoped); + VerifyLocalSymbol(locals[5], "scoped ref readonly R r51", RefKind.RefReadOnly, DeclarationScope.RefScoped); foreach (var decl in decls) { var type = ((VariableDeclarationSyntax)decl.Parent).Type; - Assert.Null(model.GetTypeInfo(type).Type); - Assert.Equal("R", model.GetSymbolInfo(type.SkipScoped(out _).SkipRef(out _)).Symbol.ToTestDisplayString()); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_Script() + { + var source = +@"#pragma warning disable 219 +scoped R r1 = default; +scoped var r11 = (R)default; + +ref struct R { } +"; + + var comp = CreateCompilation(source, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script); + comp.VerifyEmitDiagnostics( + // (2,1): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // scoped R r1 = default; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped R").WithArguments("R").WithLocation(2, 1), + // (2,10): error CS0106: The modifier 'scoped' is not valid for this item + // scoped R r1 = default; + Diagnostic(ErrorCode.ERR_BadMemberFlag, "r1").WithArguments("scoped").WithLocation(2, 10), + // (3,1): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // scoped var r11 = (R)default; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped var").WithArguments("R").WithLocation(3, 1), + // (3,12): error CS0106: The modifier 'scoped' is not valid for this item + // scoped var r11 = (R)default; + Diagnostic(ErrorCode.ERR_BadMemberFlag, "r11").WithArguments("scoped").WithLocation(3, 12) + ); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + + Assert.Equal(2, decls.Length); + + foreach (var decl in decls) + { + var f = model.GetDeclaredSymbol(decl).GetSymbol(); + + Assert.Equal(RefKind.None, f.RefKind); + Assert.Equal("Script.R", f.Type.ToTestDisplayString()); + + var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("Script.R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("Script.R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } } } @@ -10567,11 +10662,831 @@ static void verify(CSharpCompilation comp) foreach (var decl in decls) { var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_Deconstruction() + { + var source = +@"#pragma warning disable 219 +ref struct R { } +class Program +{ + static void F(RR r) + { + (scoped R r1, var a) = r; + (scoped ref R r2, var b) = r; + (scoped ref readonly R r5, var c) = r; + (scoped R _, var d) = r; + (scoped var _, var e) = r; + (scoped ref R _, var f) = r; + (scoped ref var _, var g) = r; + (scoped ref readonly R _, var h) = r; + (scoped ref readonly var _, var i) = r; + (scoped var r11, var j) = r; + (scoped ref var r21, var k) = r; + (scoped ref readonly var r51, var l) = r; + } +} + +class RR +{ + public void Deconstruct(out R x, out int y) => throw null; +} +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); + comp.VerifyEmitDiagnostics( + // (7,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped R r1, var a) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(7, 10), + // (8,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(8, 10), + // (8,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 17), + // (9,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(9, 10), + // (9,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 17), + // (10,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped R _, var d) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 10), + // (11,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped var _, var e) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 10), + // (12,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 10), + // (12,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 17), + // (13,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 10), + // (13,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 17), + // (14,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(14, 10), + // (14,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(14, 17), + // (15,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(15, 10), + // (15,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(15, 17), + // (16,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped var r11, var j) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(16, 10), + // (17,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(17, 10), + // (17,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(17, 17), + // (18,10): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(18, 10), + // (18,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(18, 17) + ); + + verify(comp); + + comp = CreateCompilation(source); + comp.VerifyEmitDiagnostics( + // (8,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 17), + // (9,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 17), + // (10,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped R _, var d) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 10), + // (11,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped var _, var e) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 10), + // (12,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 10), + // (12,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 17), + // (13,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 10), + // (13,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 17), + // (14,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(14, 10), + // (14,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(14, 17), + // (15,10): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(15, 10), + // (15,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(15, 17), + // (17,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(17, 17), + // (18,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(18, 17) + ); + + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType(). + Where(d => d.Type is ScopedTypeSyntax && d.Designation is SingleVariableDesignationSyntax). + Select(d => d.Designation).ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + Assert.Equal(6, locals.Length); + + VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[1], "scoped R r2", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[2], "scoped R r5", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[3], "scoped R r11", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[4], "scoped R r21", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[5], "scoped R r51", RefKind.None, DeclarationScope.ValueScoped); + + foreach (var decl in decls) + { + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + + var discard = tree.GetRoot().DescendantNodes().OfType().ToArray(); + Assert.Equal(6, discard.Length); + + foreach (var decl in discard) + { + Assert.Null(model.GetDeclaredSymbol(decl)); + Assert.Null(model.GetSymbolInfo(decl).Symbol); + Assert.Null(model.GetTypeInfo(decl).Type); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_Deconstruction_Script() + { + var source = +@"#pragma warning disable 219 +RR r = new RR(); +(scoped R r1, var a) = r; +(scoped ref R r2, var b) = r; +(scoped ref readonly R r5, var c) = r; +(scoped R _, var d) = r; +(scoped var _, var e) = r; +(scoped ref R _, var f) = r; +(scoped ref var _, var g) = r; +(scoped ref readonly R _, var h) = r; +(scoped ref readonly var _, var i) = r; +(scoped var r11, var j) = r; +(scoped ref var r21, var k) = r; +(scoped ref readonly var r51, var l) = r; + +ref struct R { } + +class RR +{ + public void Deconstruct(out R x, out int y) => throw null; +} +"; + var comp = CreateCompilation(source, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script); + comp.VerifyEmitDiagnostics( + // (3,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped R r1, var a) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped R").WithArguments("R").WithLocation(3, 2), + // (3,2): error CS1073: Unexpected token 'scoped' + // (scoped R r1, var a) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(3, 2), + // (4,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref R").WithArguments("R").WithLocation(4, 2), + // (4,2): error CS1073: Unexpected token 'scoped' + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(4, 2), + // (4,9): error CS1073: Unexpected token 'ref' + // (scoped ref R r2, var b) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(4, 9), + // (5,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref readonly R").WithArguments("R").WithLocation(5, 2), + // (5,2): error CS1073: Unexpected token 'scoped' + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(5, 2), + // (5,9): error CS1073: Unexpected token 'ref' + // (scoped ref readonly R r5, var c) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(5, 9), + // (6,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped R _, var d) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(6, 2), + // (7,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped var _, var e) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(7, 2), + // (8,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(8, 2), + // (8,9): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref R _, var f) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 9), + // (9,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 2), + // (9,9): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var _, var g) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 9), + // (10,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 2), + // (10,9): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly R _, var h) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(10, 9), + // (11,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 2), + // (11,9): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref readonly var _, var i) = r; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(11, 9), + // (12,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped var r11, var j) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped var").WithArguments("R").WithLocation(12, 2), + // (12,2): error CS1073: Unexpected token 'scoped' + // (scoped var r11, var j) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(12, 2), + // (13,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref var").WithArguments("R").WithLocation(13, 2), + // (13,2): error CS1073: Unexpected token 'scoped' + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(13, 2), + // (13,9): error CS1073: Unexpected token 'ref' + // (scoped ref var r21, var k) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(13, 9), + // (14,2): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref readonly var").WithArguments("R").WithLocation(14, 2), + // (14,2): error CS1073: Unexpected token 'scoped' + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(14, 2), + // (14,9): error CS1073: Unexpected token 'ref' + // (scoped ref readonly var r51, var l) = r; + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(14, 9) + ); + + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType(). + Where(d => d.Type is ScopedTypeSyntax && d.Designation is SingleVariableDesignationSyntax). + Select(d => d.Designation).ToArray(); + + Assert.Equal(6, decls.Length); + + foreach (var decl in decls) + { + var f = model.GetDeclaredSymbol(decl).GetSymbol(); + + Assert.Equal(RefKind.None, f.RefKind); + Assert.Equal("Script.R", f.Type.ToTestDisplayString()); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("Script.R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("Script.R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + + var discard = tree.GetRoot().DescendantNodes().OfType().ToArray(); + Assert.Equal(6, discard.Length); + + foreach (var decl in discard) + { + Assert.Null(model.GetDeclaredSymbol(decl)); + Assert.Null(model.GetSymbolInfo(decl).Symbol); + Assert.Null(model.GetTypeInfo(decl).Type); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("Script.R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("Script.R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_OutVar() + { + var source = +@"#pragma warning disable 219 +ref struct R { } +class Program +{ + static void F(ref R r) + { + M1(out scoped R r1); + M1(out scoped ref R r2); + M1(out scoped ref readonly R r5); + M1(out scoped R _); + M1(out scoped var _); + M1(out scoped ref R _); + M1(out scoped ref var _); + M1(out scoped ref readonly R _); + M1(out scoped ref readonly var _); + M1(out scoped var r11); + M1(out scoped ref var r21); + M1(out scoped ref readonly var r51); + + M1(out scoped _); + M1(out scoped scoped _); + } + + static void M1(out R r) => throw null; +}"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); + comp.VerifyEmitDiagnostics( + // (7,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped R r1); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(7, 16), + // (8,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(8, 16), + // (8,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref R").WithLocation(8, 23), + // (9,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(9, 16), + // (9,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly R").WithLocation(9, 23), + // (10,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 16), + // (11,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 16), + // (12,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 16), + // (12,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref R").WithLocation(12, 23), + // (13,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 16), + // (13,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(13, 23), + // (14,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(14, 16), + // (14,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly R").WithLocation(14, 23), + // (15,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(15, 16), + // (15,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly var").WithLocation(15, 23), + // (16,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped var r11); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(16, 16), + // (17,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(17, 16), + // (17,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(17, 23), + // (18,16): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(18, 16), + // (18,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly var").WithLocation(18, 23), + // (20,16): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) + // M1(out scoped _); + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(20, 16), + // (21,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped scoped _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(21, 16), + // (21,23): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) + // M1(out scoped scoped _); + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(21, 23) + ); + + verify(comp); + + comp = CreateCompilation(source); + comp.VerifyEmitDiagnostics( + // (8,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref R").WithLocation(8, 23), + // (9,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly R").WithLocation(9, 23), + // (10,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 16), + // (11,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 16), + // (12,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 16), + // (12,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref R").WithLocation(12, 23), + // (13,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 16), + // (13,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(13, 23), + // (14,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(14, 16), + // (14,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly R").WithLocation(14, 23), + // (15,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(15, 16), + // (15,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly var").WithLocation(15, 23), + // (17,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(17, 23), + // (18,23): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly var").WithLocation(18, 23), + // (20,16): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) + // M1(out scoped _); + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(20, 16), + // (21,16): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped scoped _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(21, 16), + // (21,23): error CS0246: The type or namespace name 'scoped' could not be found (are you missing a using directive or an assembly reference?) + // M1(out scoped scoped _); + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "scoped").WithArguments("scoped").WithLocation(21, 23) + ); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + Assert.Equal(6, locals.Length); + + VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[1], "scoped R r2", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[2], "scoped R r5", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[3], "scoped R r11", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[4], "scoped R r21", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[5], "scoped R r51", RefKind.None, DeclarationScope.ValueScoped); + + foreach (var decl in decls) + { + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); Assert.Null(model.GetTypeInfo(type).Type); - Assert.Equal("R", model.GetSymbolInfo(type.SkipScoped(out _).SkipRef(out _)).Symbol.ToTestDisplayString()); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + + var discard = tree.GetRoot().DescendantNodes().OfType().ToArray(); + Assert.Equal(8, discard.Length); + + for (int i = 0; i < 6; i++) + { + var decl = discard[i]; + + Assert.Null(model.GetDeclaredSymbol(decl)); + Assert.Null(model.GetSymbolInfo(decl).Symbol); + Assert.Null(model.GetTypeInfo(decl).Type); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_OutVar_Script() + { + var source = +@"#pragma warning disable 219 + +M1(out scoped R r1); +M1(out scoped ref R r2); +M1(out scoped ref readonly R r5); +M1(out scoped R _); +M1(out scoped var _); +M1(out scoped ref R _); +M1(out scoped ref var _); +M1(out scoped ref readonly R _); +M1(out scoped ref readonly var _); +M1(out scoped var r11); +M1(out scoped ref var r21); +M1(out scoped ref readonly var r51); + +static void M1(out R r) => throw null; + +ref struct R { } +"; + var comp = CreateCompilation(source, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script); + comp.VerifyEmitDiagnostics( + // (3,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped R r1); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped R").WithArguments("R").WithLocation(3, 8), + // (3,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped R r1); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(3, 8), + // (4,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref R").WithArguments("R").WithLocation(4, 8), + // (4,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(4, 8), + // (4,15): error CS1073: Unexpected token 'ref' + // M1(out scoped ref R r2); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(4, 15), + // (5,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref readonly R").WithArguments("R").WithLocation(5, 8), + // (5,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(5, 8), + // (5,15): error CS1073: Unexpected token 'ref' + // M1(out scoped ref readonly R r5); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(5, 15), + // (6,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(6, 8), + // (7,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(7, 8), + // (8,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(8, 8), + // (8,15): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref R").WithLocation(8, 15), + // (9,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 8), + // (9,15): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(9, 15), + // (10,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(10, 8), + // (10,15): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly R _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly R").WithLocation(10, 15), + // (11,8): error CS9061: The 'scoped' modifier cannot be used with discard. + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 8), + // (11,15): error CS8388: An out variable cannot be declared as a ref local + // M1(out scoped ref readonly var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref readonly var").WithLocation(11, 15), + // (12,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped var r11); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped var").WithArguments("R").WithLocation(12, 8), + // (12,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped var r11); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(12, 8), + // (13,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref var").WithArguments("R").WithLocation(13, 8), + // (13,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(13, 8), + // (13,15): error CS1073: Unexpected token 'ref' + // M1(out scoped ref var r21); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(13, 15), + // (14,8): error CS8345: Field or auto-implemented property cannot be of type 'R' unless it is an instance member of a ref struct. + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_FieldAutoPropCantBeByRefLike, "scoped ref readonly var").WithArguments("R").WithLocation(14, 8), + // (14,8): error CS1073: Unexpected token 'scoped' + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "scoped").WithArguments("scoped").WithLocation(14, 8), + // (14,15): error CS1073: Unexpected token 'ref' + // M1(out scoped ref readonly var r51); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(14, 15) + ); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + + Assert.Equal(6, decls.Length); + + + foreach (var decl in decls) + { + var f = model.GetDeclaredSymbol(decl).GetSymbol(); + + Assert.Equal(RefKind.None, f.RefKind); + Assert.Equal("Script.R", f.Type.ToTestDisplayString()); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("Script.R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("Script.R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + + var discard = tree.GetRoot().DescendantNodes().OfType().ToArray(); + Assert.Equal(6, discard.Length); + + foreach (var decl in discard) + { + Assert.Null(model.GetDeclaredSymbol(decl)); + Assert.Null(model.GetSymbolInfo(decl).Symbol); + Assert.Null(model.GetTypeInfo(decl).Type); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("Script.R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("Script.R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } } } @@ -10758,24 +11673,171 @@ static void verify(CSharpCompilation comp) } } + [Fact] + public void LocalScope_04_Deconstruction() + { + var source = +@" +var r = new RR(); +(scoped s1, var a) = r; +(@scoped s3, var b) = r; +(scoped scoped s4, var c) = r; +(scoped @scoped s6, var d) = r; + +(scoped _, var e) = r; +(scoped scoped _, var f) = r; + +ref struct @scoped { } + +class RR +{ + public void Deconstruct(out @scoped x, out int y) => throw null; +} +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); + comp.VerifyEmitDiagnostics( + // (5,2): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped scoped s4, var c) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(5, 2), + // (6,2): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // (scoped @scoped s6, var d) = r; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(6, 2), + // (9,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped scoped _, var f) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 2) + ); + verify(comp); + + comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (9,2): error CS9061: The 'scoped' modifier cannot be used with discard. + // (scoped scoped _, var f) = r; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 2) + ); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + VerifyLocalSymbol(locals[0], "scoped s1", RefKind.None, DeclarationScope.Unscoped); + VerifyLocalSymbol(locals[2], "scoped s3", RefKind.None, DeclarationScope.Unscoped); + VerifyLocalSymbol(locals[4], "scoped scoped s4", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[6], "scoped scoped s6", RefKind.None, DeclarationScope.ValueScoped); + } + } + + [Fact] + public void LocalScope_04_OutVar() + { + var source = +@" +M(out scoped s1); +M(out @scoped s3); +M(out scoped scoped s4); +M(out scoped @scoped s6); + +void M(out scoped x) => throw null; + +ref struct @scoped { } +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); + comp.VerifyEmitDiagnostics( + // (4,7): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M(out scoped scoped s4); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(4, 7), + // (5,7): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // M(out scoped @scoped s6); + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(5, 7) + ); + verify(comp); + + comp = CreateCompilation(source); + comp.VerifyDiagnostics(); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + Assert.Equal(4, locals.Length); + + VerifyLocalSymbol(locals[0], "scoped s1", RefKind.None, DeclarationScope.Unscoped); + VerifyLocalSymbol(locals[1], "scoped s3", RefKind.None, DeclarationScope.Unscoped); + VerifyLocalSymbol(locals[2], "scoped scoped s4", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[3], "scoped scoped s6", RefKind.None, DeclarationScope.ValueScoped); + } + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void LocalScope_05(LanguageVersion langVersion) + { + var source = +@"bool scoped; +scoped = true; +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(langVersion)); + comp.VerifyDiagnostics( + // (1,6): warning CS0219: The variable 'scoped' is assigned but its value is never used + // bool scoped; + Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "scoped").WithArguments("scoped").WithLocation(1, 6)); + + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + VerifyLocalSymbol(locals[0], "System.Boolean scoped", RefKind.None, DeclarationScope.Unscoped); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void LocalScope_05_For(LanguageVersion langVersion) + { + var source = +@"for (bool scoped;;) { +for (scoped = true;;) {break;} +} +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(langVersion)); + comp.VerifyDiagnostics( + // (1,11): warning CS0219: The variable 'scoped' is assigned but its value is never used + // for (bool scoped;;) { + Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "scoped").WithArguments("scoped").WithLocation(1, 11) + ); + + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + VerifyLocalSymbol(locals[0], "System.Boolean scoped", RefKind.None, DeclarationScope.Unscoped); + } + [Theory] [InlineData(LanguageVersion.CSharp10)] [InlineData(LanguageVersion.CSharp11)] - public void LocalScope_05(LanguageVersion langVersion) + public void LocalScope_05_Deconstruction(LanguageVersion langVersion) { var source = -@"bool scoped; -scoped = true; +@" +(bool scoped, var x) = (true, 0); "; var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(langVersion)); - comp.VerifyDiagnostics( - // (1,6): warning CS0219: The variable 'scoped' is assigned but its value is never used - // bool scoped; - Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "scoped").WithArguments("scoped").WithLocation(1, 6)); + comp.VerifyDiagnostics(); var tree = comp.SyntaxTrees[0]; var model = comp.GetSemanticModel(tree); - var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); VerifyLocalSymbol(locals[0], "System.Boolean scoped", RefKind.None, DeclarationScope.Unscoped); @@ -10784,23 +11846,20 @@ public void LocalScope_05(LanguageVersion langVersion) [Theory] [InlineData(LanguageVersion.CSharp10)] [InlineData(LanguageVersion.CSharp11)] - public void LocalScope_05_For(LanguageVersion langVersion) + public void LocalScope_05_OutVar(LanguageVersion langVersion) { var source = -@"for (bool scoped;;) { -for (scoped = true;;) {break;} -} +@" +M(out bool scoped); + +void M(out bool x) => throw null; "; var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(langVersion)); - comp.VerifyDiagnostics( - // (1,11): warning CS0219: The variable 'scoped' is assigned but its value is never used - // for (bool scoped;;) { - Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "scoped").WithArguments("scoped").WithLocation(1, 11) - ); + comp.VerifyDiagnostics(); var tree = comp.SyntaxTrees[0]; var model = comp.GetSemanticModel(tree); - var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); VerifyLocalSymbol(locals[0], "System.Boolean scoped", RefKind.None, DeclarationScope.Unscoped); @@ -10849,7 +11908,21 @@ static void verifyModel(CSharpCompilation comp) foreach (var decl in decls) { - var type = ((VariableDeclarationSyntax)decl.Parent).Type.SkipScoped(out _).SkipRef(out _); + var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } @@ -10899,7 +11972,168 @@ static void verifyModel(CSharpCompilation comp) foreach (var decl in decls) { - var type = ((VariableDeclarationSyntax)decl.Parent).Type.SkipScoped(out _).SkipRef(out _); + var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_06_Deconstruction() + { + var source = +@"ref struct R { } +class Program +{ + static void M(R r0) + { + (scoped var r1, var a) = new RR(new R()); + (scoped ref var r3, var b) = new RR(ref r0); + + scoped R r4; + int c; + (r4, c) = new RR(ref r0); + } +} + +ref struct RR +{ + public RR(R x){} + public RR(ref R x){} + public void Deconstruct(out R x, out int y) => throw null; +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (7,17): error CS9072: A deconstruction variable cannot be declared as a ref local + // (scoped ref var r3, var b) = new RR(ref r0); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(7, 17) + ); + + verifyModel(comp); + + comp = CreateCompilation(source, parseOptions: TestOptions.RegularDefault.WithFeature("run-nullable-analysis", "never")); + verifyModel(comp); + + static void verifyModel(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + for (int i = 0; i < 3; i += 2) + { + Assert.True(locals[i].IsVar); + Assert.Equal("R", locals[i].Type.ToTestDisplayString()); + } + + VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[2], "scoped R r3", RefKind.None, DeclarationScope.ValueScoped); + + for (int i = 0; i < 3; i += 2) + { + var decl = decls[i]; + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_06_OutVar() + { + var source = +@"ref struct R { } +class Program +{ + static void M(R r0) + { + M1(out scoped var r1, new R()); + M2(out scoped ref var r3, ref r0); + + scoped R r4; + M2(out r4, ref r0); + } + + static void M1(out R y, R x) => throw null; + static void M2(out R y, ref R x) => throw null; +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (7,23): error CS8388: An out variable cannot be declared as a ref local + // M2(out scoped ref var r3, ref r0); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(7, 23) + ); + + verifyModel(comp); + + comp = CreateCompilation(source, parseOptions: TestOptions.RegularDefault.WithFeature("run-nullable-analysis", "never")); + verifyModel(comp); + + static void verifyModel(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + foreach (SourceLocalSymbol local in locals) + { + Assert.True(local.IsVar); + Assert.Equal("R", local.Type.ToTestDisplayString()); + } + + VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[1], "scoped R r3", RefKind.None, DeclarationScope.ValueScoped); + + foreach (var decl in decls) + { + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } @@ -11106,6 +12340,51 @@ public S(ref int i) { } comp.VerifyDiagnostics(); } + [Fact] + public void LocalScope_10_Deconstruction() + { + var source = +@"{ + int i = 0; + S s1 = new S(ref i); + (scoped S s2, var a) = s1; + scoped S s3; + int b; + (s3, b) = s1; +} +ref struct S +{ + public S(ref int i) { } + + public void Deconstruct(out S x, out int y) => throw null; +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics(); + } + + [Fact] + public void LocalScope_10_OutVar() + { + var source = +@"{ + int i = 0; + S s1 = new S(ref i); + s1.M(out scoped S s2); + scoped S s3; + s1.M(out s3); +} +ref struct S +{ + public S(ref int i) { } + + public void M(out S x) => throw null; +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics(); + } + [Fact] public void LocalScope_11() { @@ -11287,30 +12566,147 @@ static void Main() s0 = s2; // 2 break; } - for (S s3 = s0;;) { + for (S s3 = s0;;) { + s0 = s3; + break; + } + } +} +ref struct S +{ + public S(ref int i) { } +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (10,22): error CS8352: Cannot use variable 's1' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s1; // 1 + Diagnostic(ErrorCode.ERR_EscapeVariable, "s1").WithArguments("s1").WithLocation(10, 22), + // (15,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s2; // 2 + Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(15, 18) + ); + } + + [Fact] + public void LocalScope_12_For_02() + { + var source = +@"class Program +{ + static void Main() + { + int i0 = 0; + for (S s0 = new S(ref i0);;) + { + int i1 = 1; + S s1 = new S(ref i1); + s0 = s1; // 1 + + scoped S s2 = s0; + s0 = s2; // 2 + + S s3 = s0; + s0 = s3; + + break; + } + } +} +ref struct S +{ + public S(ref int i) { } +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (10,18): error CS8352: Cannot use variable 's1' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s1; // 1 + Diagnostic(ErrorCode.ERR_EscapeVariable, "s1").WithArguments("s1").WithLocation(10, 18), + // (13,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s2; // 2 + Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(13, 18) + ); + } + + [Fact] + public void LocalScope_12_Deconstruct() + { + var source = +@"class Program +{ + static void Main() + { + int i0 = 0; + S s0 = new S(ref i0); + { + int i1 = 1; + (S s1, var a) = new S(ref i1); + s0 = s1; + } + { + (scoped S s2, var b) = s0; + s0 = s2; + } + { + (S s3, var c) = s0; s0 = s3; - break; + } + { + int i1 = 1; + S s11; + int d; + (s11, d) = new S(ref i1); + s0 = s11; + } + { + scoped S s21; + int e; + (s21, e) = s0; + s0 = s21; + } + { + S s31; + int f; + (s31, f) = s0; + s0 = s31; } } } ref struct S { public S(ref int i) { } + public void Deconstruct(out S x, out int y) => throw null; } "; var comp = CreateCompilation(source); comp.VerifyDiagnostics( - // (10,22): error CS8352: Cannot use variable 's1' in this context because it may expose referenced variables outside of their declaration scope - // s0 = s1; // 1 - Diagnostic(ErrorCode.ERR_EscapeVariable, "s1").WithArguments("s1").WithLocation(10, 22), - // (15,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope - // s0 = s2; // 2 - Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(15, 18) + // (10,18): error CS8352: Cannot use variable 's1' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s1; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s1").WithArguments("s1").WithLocation(10, 18), + // (14,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s2; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(14, 18), + // (24,13): error CS8352: Cannot use variable '(s11, d) = new S(ref i1)' in this context because it may expose referenced variables outside of their declaration scope + // (s11, d) = new S(ref i1); + Diagnostic(ErrorCode.ERR_EscapeVariable, "(s11, d) = new S(ref i1)").WithArguments("(s11, d) = new S(ref i1)").WithLocation(24, 13), + // (24,24): error CS8350: This combination of arguments to 'S.Deconstruct(out S, out int)' is disallowed because it may expose variables referenced by parameter 'this' outside of their declaration scope + // (s11, d) = new S(ref i1); + Diagnostic(ErrorCode.ERR_CallArgMixing, "new S(ref i1)").WithArguments("S.Deconstruct(out S, out int)", "this").WithLocation(24, 24), + // (31,18): error CS8352: Cannot use variable 's21' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s21; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s21").WithArguments("s21").WithLocation(31, 18), + // (36,13): error CS8352: Cannot use variable '(s31, f) = s0' in this context because it may expose referenced variables outside of their declaration scope + // (s31, f) = s0; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(s31, f) = s0").WithArguments("(s31, f) = s0").WithLocation(36, 13), + // (36,24): error CS8350: This combination of arguments to 'S.Deconstruct(out S, out int)' is disallowed because it may expose variables referenced by parameter 'this' outside of their declaration scope + // (s31, f) = s0; + Diagnostic(ErrorCode.ERR_CallArgMixing, "s0").WithArguments("S.Deconstruct(out S, out int)", "this").WithLocation(36, 24) ); } [Fact] - public void LocalScope_12_For_02() + public void LocalScope_12_OutVar() { var source = @"class Program @@ -11318,35 +12714,69 @@ public void LocalScope_12_For_02() static void Main() { int i0 = 0; - for (S s0 = new S(ref i0);;) + S s0 = new S(ref i0); { int i1 = 1; - S s1 = new S(ref i1); - s0 = s1; // 1 - - scoped S s2 = s0; - s0 = s2; // 2 - - S s3 = s0; + (new S(ref i1)).M(out S s1); + s0 = s1; + } + { + s0.M(out scoped S s2); + s0 = s2; + } + { + s0.M(out S s3); s0 = s3; + } + { + scoped S s21; + s0.M(out s21); + s0 = s21; + } - break; + { + int i1 = 1; + (new S(ref i1)).M(out scoped S s4); + s0 = s4; + } + { + int i1 = 1; + (new S(ref i1)).M(out var s5); + s0 = s5; + } + { + int i1 = 1; + (new S(ref i1)).M(out scoped var s7); + s0 = s7; } } } ref struct S { public S(ref int i) { } + public void M(out S x) => throw null; } "; var comp = CreateCompilation(source); comp.VerifyDiagnostics( // (10,18): error CS8352: Cannot use variable 's1' in this context because it may expose referenced variables outside of their declaration scope - // s0 = s1; // 1 + // s0 = s1; Diagnostic(ErrorCode.ERR_EscapeVariable, "s1").WithArguments("s1").WithLocation(10, 18), - // (13,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope - // s0 = s2; // 2 - Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(13, 18) + // (14,18): error CS8352: Cannot use variable 's2' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s2; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s2").WithArguments("s2").WithLocation(14, 18), + // (23,18): error CS8352: Cannot use variable 's21' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s21; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s21").WithArguments("s21").WithLocation(23, 18), + // (29,18): error CS8352: Cannot use variable 's4' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s4; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s4").WithArguments("s4").WithLocation(29, 18), + // (34,18): error CS8352: Cannot use variable 's5' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s5; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s5").WithArguments("s5").WithLocation(34, 18), + // (39,18): error CS8352: Cannot use variable 's7' in this context because it may expose referenced variables outside of their declaration scope + // s0 = s7; + Diagnostic(ErrorCode.ERR_EscapeVariable, "s7").WithArguments("s7").WithLocation(39, 18) ); } @@ -11464,6 +12894,62 @@ static void Main() ); } + [Fact] + public void ScopedRefAndRefStructOnly_06_Deconstruct() + { + var source = +@"#pragma warning disable CS0219 // The variable is assigned but its value is never used +struct S { } +class Program +{ + static void Main() + { + (scoped var y1, var a) = (new S(), 0); + (var y2, var b) = (new S(), 1); + (scoped S y3, var c) = (new S(), 0); + (S y4, var d) = (new S(), 1); + } +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (7,17): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // (scoped var y1, var a) = (new S(), 0); + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "var").WithLocation(7, 17), + // (9,17): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // (scoped S y3, var c) = (new S(), 0); + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "S").WithLocation(9, 17) + ); + } + + [Fact] + public void ScopedRefAndRefStructOnly_06_OutVar() + { + var source = +@"#pragma warning disable CS0219 // The variable is assigned but its value is never used +struct S { } +class Program +{ + static void Main() + { + M(out scoped var y1); + M(out var y2); + M(out scoped S y3); + M(out S y4); + } + + static void M(out S x) => throw null; +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (7,22): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // M(out scoped var y1); + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "var").WithLocation(7, 22), + // (9,22): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // M(out scoped S y3); + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "S").WithLocation(9, 22) + ); + } + [Fact] public void LocalScopeAndInitializer_01() { @@ -11577,11 +13063,288 @@ static void verify(CSharpCompilation comp) foreach (var decl in decls) { var type = decl.Type; - Assert.Null(model.GetTypeInfo(type).Type); - Assert.Equal("R", model.GetSymbolInfo(type.SkipScoped(out _).SkipRef(out _)).Symbol.ToTestDisplayString()); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + } + + [Fact] + public void LocalScope_01_Foreach_Deconstruction() + { + var source = +@"#pragma warning disable 219 + +class Program +{ + static void F(ref R r) + { + foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + + foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + } +} + +ref struct R +{ + public void Deconstruct(out R x, out R y) => throw null; +} + +class Enumerable1 +{ + public Enumerator1 GetEnumerator() => default; +} + +class Enumerator1 +{ + public R Current => default; + public bool MoveNext() => false; +} + +class Enumerable2 +{ + public Enumerable2(ref R x) {} + public Enumerator2 GetEnumerator() => default; +} + +class Enumerator2 +{ + public ref R Current => throw null; + public bool MoveNext() => false; +} +"; + var comp = CreateCompilation(source, parseOptions: TestOptions.Regular10); + comp.VerifyEmitDiagnostics( + // (7,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(7, 19), + // (7,32): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(7, 32), + // (8,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(8, 19), + // (8,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 26), + // (8,36): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(8, 36), + // (8,43): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 43), + // (9,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(9, 19), + // (9,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 26), + // (9,45): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 45), + // (9,52): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 52), + // (11,18): error CS8352: Cannot use variable '(scoped var r11, scoped R _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped var r11, scoped R _)").WithArguments("(scoped var r11, scoped R _)").WithLocation(11, 18), + // (11,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(11, 19), + // (11,35): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 35), + // (11,50): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'y' outside of their declaration scope + // foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable1()").WithArguments("R.Deconstruct(out R, out R)", "y").WithLocation(11, 50), + // (12,18): error CS8352: Cannot use variable '(scoped ref var r21, scoped ref R _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped ref var r21, scoped ref R _)").WithArguments("(scoped ref var r21, scoped ref R _)").WithLocation(12, 18), + // (12,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(12, 19), + // (12,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 26), + // (12,39): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 39), + // (12,46): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 46), + // (12,58): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'y' outside of their declaration scope + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable2(ref r)").WithArguments("R.Deconstruct(out R, out R)", "y").WithLocation(12, 58), + // (13,18): error CS8352: Cannot use variable '(scoped ref readonly var r51, scoped ref readonly R _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped ref readonly var r51, scoped ref readonly R _)").WithArguments("(scoped ref readonly var r51, scoped ref readonly R _)").WithLocation(13, 18), + // (13,19): error CS8936: Feature 'ref fields' is not available in C# 10.0. Please use language version 11.0 or greater. + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "scoped").WithArguments("ref fields", "11.0").WithLocation(13, 19), + // (13,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 26), + // (13,48): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 48), + // (13,55): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 55), + // (13,76): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'y' outside of their declaration scope + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable2(ref r)").WithArguments("R.Deconstruct(out R, out R)", "y").WithLocation(13, 76) + ); + + verify(comp); + + comp = CreateCompilation(source); + comp.VerifyEmitDiagnostics( + // (7,18): error CS8352: Cannot use variable '(scoped R r1, scoped var _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped R r1, scoped var _)").WithArguments("(scoped R r1, scoped var _)").WithLocation(7, 18), + // (7,32): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(7, 32), + // (7,49): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'x' outside of their declaration scope + // foreach ((scoped R r1, scoped var _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable1()").WithArguments("R.Deconstruct(out R, out R)", "x").WithLocation(7, 49), + // (8,18): error CS8352: Cannot use variable '(scoped ref R r2, scoped ref var _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped ref R r2, scoped ref var _)").WithArguments("(scoped ref R r2, scoped ref var _)").WithLocation(8, 18), + // (8,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 26), + // (8,36): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(8, 36), + // (8,43): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 43), + // (8,57): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'x' outside of their declaration scope + // foreach ((scoped ref R r2, scoped ref var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable2(ref r)").WithArguments("R.Deconstruct(out R, out R)", "x").WithLocation(8, 57), + // (9,18): error CS8352: Cannot use variable '(scoped ref readonly R r5, scoped ref readonly var _)' in this context because it may expose referenced variables outside of their declaration scope + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_EscapeVariable, "(scoped ref readonly R r5, scoped ref readonly var _)").WithArguments("(scoped ref readonly R r5, scoped ref readonly var _)").WithLocation(9, 18), + // (9,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 26), + // (9,45): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(9, 45), + // (9,52): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(9, 52), + // (9,75): error CS8350: This combination of arguments to 'R.Deconstruct(out R, out R)' is disallowed because it may expose variables referenced by parameter 'x' outside of their declaration scope + // foreach ((scoped ref readonly R r5, scoped ref readonly var _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_CallArgMixing, "new Enumerable2(ref r)").WithArguments("R.Deconstruct(out R, out R)", "x").WithLocation(9, 75), + // (11,35): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped var r11, scoped R _) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(11, 35), + // (12,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 26), + // (12,39): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(12, 39), + // (12,46): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref var r21, scoped ref R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(12, 46), + // (13,26): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 26), + // (13,48): error CS9061: The 'scoped' modifier cannot be used with discard. + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_ScopedDiscard, "scoped").WithLocation(13, 48), + // (13,55): error CS9072: A deconstruction variable cannot be declared as a ref local + // foreach ((scoped ref readonly var r51, scoped ref readonly R _) in new Enumerable2(ref r)) break; + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(13, 55) + ); + verify(comp); + + static void verify(CSharpCompilation comp) + { + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + var locals = decls.Select(d => model.GetDeclaredSymbol(d).GetSymbol()).ToArray(); + + VerifyLocalSymbol(locals[0], "scoped R r1", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[1], "scoped R r2", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[2], "scoped R r5", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[3], "scoped R r11", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[4], "scoped R r21", RefKind.None, DeclarationScope.ValueScoped); + VerifyLocalSymbol(locals[5], "scoped R r51", RefKind.None, DeclarationScope.ValueScoped); + + foreach (var decl in decls) + { + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + + var discard = tree.GetRoot().DescendantNodes().OfType().ToArray(); + Assert.Equal(6, discard.Length); + + foreach (var decl in discard) + { + Assert.Null(model.GetDeclaredSymbol(decl)); + Assert.Null(model.GetSymbolInfo(decl).Symbol); + Assert.Null(model.GetTypeInfo(decl).Type); + + var type = ((DeclarationExpressionSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } } } @@ -11739,7 +13502,21 @@ static void verifyModel(CSharpCompilation comp) foreach (var decl in decls) { - var type = decl.Type.SkipScoped(out _).SkipRef(out _); + var type = decl.Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } @@ -12213,6 +13990,8 @@ static void Main() { foreach (scoped var y1 in new Enumerable1()) break; foreach (scoped ref var y3 in new Enumerable2()) break; + foreach (scoped S y1 in new Enumerable1()) break; + foreach (scoped ref S y3 in new Enumerable2()) break; } } @@ -12242,7 +14021,50 @@ class Enumerator2 comp.VerifyDiagnostics( // (7,25): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. // foreach (scoped var y1 in new Enumerable1()) break; - Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "var").WithLocation(7, 25) + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "var").WithLocation(7, 25), + // (9,25): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // foreach (scoped S y1 in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "S").WithLocation(9, 25) + ); + } + + [Fact] + public void ScopedRefAndRefStructOnly_06_Foreach_Deconstruction() + { + var source = +@" +class Program +{ + static void Main() + { + foreach ((scoped var y1, scoped S y2) in new Enumerable1()) break; + } +} + +struct S +{ + public void Deconstruct(out S x, out S y) => throw null; +} + +class Enumerable1 +{ + public Enumerator1 GetEnumerator() => default; +} + +class Enumerator1 +{ + public S Current => default; + public bool MoveNext() => false; +} +"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (6,26): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // foreach ((scoped var y1, scoped S y2) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "var").WithLocation(6, 26), + // (6,41): error CS9048: The 'scoped' modifier can be used for refs and ref struct values only. + // foreach ((scoped var y1, scoped S y2) in new Enumerable1()) break; + Diagnostic(ErrorCode.ERR_ScopedRefAndRefStructOnly, "S").WithLocation(6, 41) ); } @@ -21180,11 +23002,26 @@ static void verify(CSharpCompilation comp) foreach (var decl in decls) { var type = ((VariableDeclarationSyntax)decl.Parent).Type; - Assert.Null(model.GetTypeInfo(type).Type); - Assert.Equal("R", model.GetSymbolInfo(type.SkipScoped(out _).SkipRef(out _)).Symbol.ToTestDisplayString()); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } } } @@ -21255,11 +23092,26 @@ static void verify(CSharpCompilation comp) foreach (var decl in decls) { var type = ((VariableDeclarationSyntax)decl.Parent).Type; - Assert.Null(model.GetTypeInfo(type).Type); - Assert.Equal("R", model.GetSymbolInfo(type.SkipScoped(out _).SkipRef(out _)).Symbol.ToTestDisplayString()); + Assert.True(SyntaxFacts.IsInTypeOnlyContext(type)); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _))); Assert.True(SyntaxFacts.IsInTypeOnlyContext(type.SkipScoped(out _).SkipRef(out _))); + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } } } @@ -21510,7 +23362,13 @@ static void verifyModel(CSharpCompilation comp) foreach (var decl in decls) { - var type = ((VariableDeclarationSyntax)decl.Parent).Type.SkipScoped(out _).SkipRef(out _); + var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } @@ -21564,7 +23422,13 @@ static void verifyModel(CSharpCompilation comp) foreach (var decl in decls) { - var type = ((VariableDeclarationSyntax)decl.Parent).Type.SkipScoped(out _).SkipRef(out _); + var type = ((VariableDeclarationSyntax)decl.Parent).Type; + + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = type.SkipScoped(out _); + Assert.Equal("R", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); Assert.Equal("R", model.GetTypeInfo(type).Type.ToTestDisplayString()); } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RefLocalsAndReturnsTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RefLocalsAndReturnsTests.cs index 2cae92816e40b..50681c9578a6a 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RefLocalsAndReturnsTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RefLocalsAndReturnsTests.cs @@ -4754,5 +4754,159 @@ public void Dispose() {} Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(4, 7) ); } + + [Fact] + [WorkItem(64259, "https://github.com/dotnet/roslyn/issues/64259")] + public void RefLocalInDeconstruct_01() + { + var code = @" +class C +{ + static void Main() + { + int x = 0, y = 0; + (ref int a, ref readonly int b) = (x, y); + } +} +"; + + CreateCompilation(code).VerifyEmitDiagnostics( + // (7,10): error CS9072: A deconstruction variable cannot be declared as a ref local + // (ref int a, ref readonly int b) = (x, y); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(7, 10), + // (7,21): error CS9072: A deconstruction variable cannot be declared as a ref local + // (ref int a, ref readonly int b) = (x, y); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(7, 21) + ); + } + + [Fact] + [WorkItem(64259, "https://github.com/dotnet/roslyn/issues/64259")] + public void RefLocalInDeconstruct_02() + { + var code = @" +class C +{ + static void Main() + { + int x = 0, y = 0, z = 0; + (ref var a, ref var (b, c)) = (x, (y, z)); + (ref int d, var e) = (x, y); + } +} +"; + + var comp = CreateCompilation(code).VerifyEmitDiagnostics( + // (7,10): error CS9072: A deconstruction variable cannot be declared as a ref local + // (ref var a, ref var (b, c)) = (x, (y, z)); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(7, 10), + // (7,21): error CS1525: Invalid expression term 'ref' + // (ref var a, ref var (b, c)) = (x, (y, z)); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref var (b, c)").WithArguments("ref").WithLocation(7, 21), + // (7,21): error CS1073: Unexpected token 'ref' + // (ref var a, ref var (b, c)) = (x, (y, z)); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(7, 21), + // (8,10): error CS9072: A deconstruction variable cannot be declared as a ref local + // (ref int d, var e) = (x, y); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(8, 10) + ); + + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + + foreach (var decl in decls) + { + var type = decl.Type; + + if (type is RefTypeSyntax refType) + { + Assert.Null(model.GetSymbolInfo(type).Symbol); + Assert.Null(model.GetTypeInfo(type).Type); + + type = refType.Type; + } + + Assert.Equal("System.Int32", model.GetSymbolInfo(type).Symbol.ToTestDisplayString()); + Assert.Equal("System.Int32", model.GetTypeInfo(type).Type.ToTestDisplayString()); + } + } + + [Fact] + [WorkItem(64259, "https://github.com/dotnet/roslyn/issues/64259")] + public void RefLocalInDeconstruct_03() + { + var code = @" +int x = 0, y = 0, z = 0; +(ref var d, var e) = (x, y); +(ref int f, ref var _) = (x, y); +"; + + var comp = CreateCompilation(code, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script); + comp.VerifyEmitDiagnostics( + // (3,2): error CS1073: Unexpected token 'ref' + // (ref var d, var e) = (x, y); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(3, 2), + // (4,2): error CS1073: Unexpected token 'ref' + // (ref int f, ref var _) = (x, y); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(4, 2), + // (4,13): error CS9072: A deconstruction variable cannot be declared as a ref local + // (ref int f, ref var _) = (x, y); + Diagnostic(ErrorCode.ERR_DeconstructVariableCannotBeByRef, "ref").WithLocation(4, 13) + ); + + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + + Assert.Equal(3, decls.Length); + + foreach (var decl in decls) + { + var f = model.GetDeclaredSymbol(decl).GetSymbol(); + + Assert.Equal(RefKind.None, f.RefKind); + Assert.Equal("System.Int32", f.Type.ToTestDisplayString()); + } + } + + [Fact] + public void RefLocalInOutVar_01() + { + var code = @" +M(out ref var a); +M(out ref int b); +M(out ref var _); + +void M(out int x) => throw null; +"; + + var comp = CreateCompilation(code, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script); + comp.VerifyEmitDiagnostics( + // (2,7): error CS1073: Unexpected token 'ref' + // M(out ref var a); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(2, 7), + // (3,7): error CS1073: Unexpected token 'ref' + // M(out ref int b); + Diagnostic(ErrorCode.ERR_UnexpectedToken, "ref").WithArguments("ref").WithLocation(3, 7), + // (4,7): error CS8388: An out variable cannot be declared as a ref local + // M(out ref var _); + Diagnostic(ErrorCode.ERR_OutVariableCannotBeByRef, "ref var").WithLocation(4, 7) + ); + + var tree = comp.SyntaxTrees[0]; + var model = comp.GetSemanticModel(tree); + var decls = tree.GetRoot().DescendantNodes().OfType().ToArray(); + + Assert.Equal(2, decls.Length); + + foreach (var decl in decls) + { + var f = model.GetDeclaredSymbol(decl).GetSymbol(); + + Assert.Equal(RefKind.None, f.RefKind); + Assert.Equal("System.Int32", f.Type.ToTestDisplayString()); + } + } } } diff --git a/src/Compilers/CSharp/Test/Syntax/Parsing/DeclarationScopeParsingTests.cs b/src/Compilers/CSharp/Test/Syntax/Parsing/DeclarationScopeParsingTests.cs index c202957201205..c9e067e2a450c 100644 --- a/src/Compilers/CSharp/Test/Syntax/Parsing/DeclarationScopeParsingTests.cs +++ b/src/Compilers/CSharp/Test/Syntax/Parsing/DeclarationScopeParsingTests.cs @@ -3317,6 +3317,5009 @@ public void Local_16(LanguageVersion langVersion) EOF(); } + [Fact] + public void Local_17() + { + string source = +@" +scoped R x; +"; + UsingTree(source, TestOptions.Script); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.FieldDeclaration); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "R"); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "x"); + } + } + N(SyntaxKind.SemicolonToken); + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Fact] + public void Local_18() + { + string source = +@" +scoped ref R x = M; +"; + UsingTree(source, TestOptions.Script, + // (2,16): error CS1003: Syntax error, '(' expected + // scoped ref R x = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "=").WithArguments("(").WithLocation(2, 16), + // (2,16): error CS1001: Identifier expected + // scoped ref R x = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, "=").WithLocation(2, 16), + // (2,19): error CS1001: Identifier expected + // scoped ref R x = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, ";").WithLocation(2, 19), + // (2,19): error CS1026: ) expected + // scoped ref R x = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, ";").WithLocation(2, 19) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.MethodDeclaration); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "R"); + } + } + N(SyntaxKind.IdentifierToken, "x"); + N(SyntaxKind.ParameterList); + { + M(SyntaxKind.OpenParenToken); + N(SyntaxKind.Parameter); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + M(SyntaxKind.IdentifierToken); + } + M(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.SemicolonToken); + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Fact] + public void Local_19() + { + string source = +@" +scoped ref readonly R x = M; +"; + UsingTree(source, TestOptions.Script, + // (2,25): error CS1003: Syntax error, '(' expected + // scoped ref readonly R x = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "=").WithArguments("(").WithLocation(2, 25), + // (2,25): error CS1001: Identifier expected + // scoped ref readonly R x = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, "=").WithLocation(2, 25), + // (2,28): error CS1001: Identifier expected + // scoped ref readonly R x = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, ";").WithLocation(2, 28), + // (2,28): error CS1026: ) expected + // scoped ref readonly R x = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, ";").WithLocation(2, 28) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.MethodDeclaration); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "R"); + } + } + N(SyntaxKind.IdentifierToken, "x"); + N(SyntaxKind.ParameterList); + { + M(SyntaxKind.OpenParenToken); + N(SyntaxKind.Parameter); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + M(SyntaxKind.IdentifierToken); + } + M(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.SemicolonToken); + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_01(LanguageVersion langVersion) + { + string source = +@" +(scoped a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_02(LanguageVersion langVersion) + { + string source = +@" +(ref scoped b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_03(LanguageVersion langVersion) + { + string source = +@" +(ref scoped int b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,2): error CS1525: Invalid expression term 'ref' + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref scoped").WithArguments("ref").WithLocation(2, 2), + // (2,13): error CS1026: ) expected + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "int").WithLocation(2, 13), + // (2,13): error CS1002: ; expected + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "int").WithLocation(2, 13), + // (2,20): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 20), + // (2,24): error CS1003: Syntax error, ',' expected + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "c").WithArguments(",").WithLocation(2, 24), + // (2,25): error CS1002: ; expected + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 25), + // (2,25): error CS1022: Type or namespace definition, or end-of-file expected + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 25), + // (2,27): error CS1525: Invalid expression term '=' + // (ref scoped int b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 27) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "b"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_04(LanguageVersion langVersion) + { + string source = +@" +(ref scoped a b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,2): error CS1525: Invalid expression term 'ref' + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref scoped").WithArguments("ref").WithLocation(2, 2), + // (2,13): error CS1026: ) expected + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "a").WithLocation(2, 13), + // (2,13): error CS1002: ; expected + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "a").WithLocation(2, 13), + // (2,18): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 18), + // (2,22): error CS1003: Syntax error, ',' expected + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "c").WithArguments(",").WithLocation(2, 22), + // (2,23): error CS1002: ; expected + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 23), + // (2,23): error CS1022: Type or namespace definition, or end-of-file expected + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 23), + // (2,25): error CS1525: Invalid expression term '=' + // (ref scoped a b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 25) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "b"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_05(LanguageVersion langVersion) + { + string source = +@" +(ref readonly scoped c, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "d"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_06(LanguageVersion langVersion) + { + string source = +@" +(ref readonly scoped int c, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,2): error CS1525: Invalid expression term 'ref' + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref ").WithArguments("ref").WithLocation(2, 2), + // (2,6): error CS1525: Invalid expression term 'readonly' + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "readonly").WithArguments("readonly").WithLocation(2, 6), + // (2,6): error CS1026: ) expected + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "readonly").WithLocation(2, 6), + // (2,6): error CS1002: ; expected + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "readonly").WithLocation(2, 6), + // (2,6): error CS0106: The modifier 'readonly' is not valid for this item + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_BadMemberFlag, "readonly").WithArguments("readonly").WithLocation(2, 6), + // (2,29): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 29), + // (2,33): error CS1003: Syntax error, ',' expected + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "d").WithArguments(",").WithLocation(2, 33), + // (2,34): error CS1002: ; expected + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 34), + // (2,34): error CS1022: Type or namespace definition, or end-of-file expected + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 34), + // (2,36): error CS1525: Invalid expression term '=' + // (ref readonly scoped int c, var d) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 36) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "c"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_07(LanguageVersion langVersion) + { + string source = +@" +(ref scoped readonly int c, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,2): error CS1525: Invalid expression term 'ref' + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref scoped").WithArguments("ref").WithLocation(2, 2), + // (2,13): error CS1026: ) expected + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "readonly").WithLocation(2, 13), + // (2,13): error CS1002: ; expected + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "readonly").WithLocation(2, 13), + // (2,13): error CS0106: The modifier 'readonly' is not valid for this item + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_BadMemberFlag, "readonly").WithArguments("readonly").WithLocation(2, 13), + // (2,29): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 29), + // (2,33): error CS1003: Syntax error, ',' expected + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "d").WithArguments(",").WithLocation(2, 33), + // (2,34): error CS1002: ; expected + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 34), + // (2,34): error CS1022: Type or namespace definition, or end-of-file expected + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 34), + // (2,36): error CS1525: Invalid expression term '=' + // (ref scoped readonly int c, var d) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 36) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "c"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_08(LanguageVersion langVersion) + { + string source = +@" +(scoped int a, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "d"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_09(LanguageVersion langVersion) + { + string source = +@" +(@scoped int a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1026: ) expected + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "int").WithLocation(2, 10), + // (2,10): error CS1002: ; expected + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "int").WithLocation(2, 10), + // (2,17): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 17), + // (2,21): error CS1003: Syntax error, ',' expected + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 21), + // (2,22): error CS1002: ; expected + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 22), + // (2,22): error CS1022: Type or namespace definition, or end-of-file expected + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 22), + // (2,24): error CS1525: Invalid expression term '=' + // (@scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 24) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "a"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_10(LanguageVersion langVersion) + { + string source = +@" +(scoped ref int b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_11(LanguageVersion langVersion) + { + string source = +@" +(@scoped ref int b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1026: ) expected + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "ref").WithLocation(2, 10), + // (2,10): error CS1002: ; expected + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "ref").WithLocation(2, 10), + // (2,21): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 21), + // (2,25): error CS1003: Syntax error, ',' expected + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "c").WithArguments(",").WithLocation(2, 25), + // (2,26): error CS1002: ; expected + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 26), + // (2,26): error CS1022: Type or namespace definition, or end-of-file expected + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 26), + // (2,28): error CS1525: Invalid expression term '=' + // (@scoped ref int b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 28) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "b"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_12(LanguageVersion langVersion) + { + string source = +@" +(scoped ref readonly int a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_13(LanguageVersion langVersion) + { + string source = +@" +(@scoped ref readonly int a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1026: ) expected + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "ref").WithLocation(2, 10), + // (2,10): error CS1002: ; expected + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "ref").WithLocation(2, 10), + // (2,30): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 30), + // (2,34): error CS1003: Syntax error, ',' expected + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 34), + // (2,35): error CS1002: ; expected + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 35), + // (2,35): error CS1022: Type or namespace definition, or end-of-file expected + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 35), + // (2,37): error CS1525: Invalid expression term '=' + // (@scoped ref readonly int a, var b) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 37) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "a"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_14(LanguageVersion langVersion) + { + string source = +@" +(scoped S a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_15(LanguageVersion langVersion) + { + string source = +@" +(scoped ref S b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_16(LanguageVersion langVersion) + { + string source = +@" +(scoped ref readonly S a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_17(LanguageVersion langVersion) + { + string source = +@" +(scoped.nested a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.QualifiedName); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.DotToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "nested"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_18(LanguageVersion langVersion) + { + string source = +@" +(scoped scoped a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_20(LanguageVersion langVersion) + { + string source = +@" +(scoped var a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_21(LanguageVersion langVersion) + { + string source = +@" +(scoped ref var b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_22(LanguageVersion langVersion) + { + string source = +@" +(scoped ref readonly var c, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "d"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_23(LanguageVersion langVersion) + { + string source = +@" +(scoped var, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_24(LanguageVersion langVersion) + { + string source = +@" +(ref scoped var, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_25(LanguageVersion langVersion) + { + string source = +@" +(scoped scoped int a, var b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,9): error CS1026: ) expected + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "scoped").WithLocation(2, 9), + // (2,9): error CS1002: ; expected + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "scoped").WithLocation(2, 9), + // (2,23): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 23), + // (2,27): error CS1003: Syntax error, ',' expected + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 27), + // (2,28): error CS1002: ; expected + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 28), + // (2,28): error CS1022: Type or namespace definition, or end-of-file expected + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 28), + // (2,30): error CS1525: Invalid expression term '=' + // (scoped scoped int a, var b) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 30) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "a"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_26(LanguageVersion langVersion) + { + string source = +@" +(scoped scoped var b, var c) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,9): error CS1026: ) expected + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "scoped").WithLocation(2, 9), + // (2,9): error CS1002: ; expected + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "scoped").WithLocation(2, 9), + // (2,23): error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_MultiTypeInDeclaration, "var").WithLocation(2, 23), + // (2,27): error CS1003: Syntax error, ',' expected + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_SyntaxError, "c").WithArguments(",").WithLocation(2, 27), + // (2,28): error CS1002: ; expected + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 28), + // (2,28): error CS1022: Type or namespace definition, or end-of-file expected + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 28), + // (2,30): error CS1525: Invalid expression term '=' + // (scoped scoped var b, var c) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 30) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.ParenthesizedExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "b"); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_27(LanguageVersion langVersion) + { + string source = +@" +scoped var (a, b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,14): error CS1001: Identifier expected + // scoped var (a, b) = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, ",").WithLocation(2, 14), + // (2,17): error CS1001: Identifier expected + // scoped var (a, b) = M; + Diagnostic(ErrorCode.ERR_IdentifierExpected, ")").WithLocation(2, 17), + // (2,19): error CS1002: ; expected + // scoped var (a, b) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "=").WithLocation(2, 19), + // (2,19): error CS1525: Invalid expression term '=' + // scoped var (a, b) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 19) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalFunctionStatement); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.IdentifierToken, "var"); + N(SyntaxKind.ParameterList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Parameter); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Parameter); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_28(LanguageVersion langVersion) + { + string source = +@" +scoped ref var (a, b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,12): error CS0116: A namespace cannot directly contain members such as fields, methods or statements + // scoped ref var (a, b) = M; + Diagnostic(ErrorCode.ERR_NamespaceUnexpected, "var").WithLocation(2, 12) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.IncompleteMember); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_29(LanguageVersion langVersion) + { + string source = +@" +scoped ref readonly var (a, b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,21): error CS0116: A namespace cannot directly contain members such as fields, methods or statements + // scoped ref readonly var (a, b) = M; + Diagnostic(ErrorCode.ERR_NamespaceUnexpected, "var").WithLocation(2, 21) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.IncompleteMember); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_30(LanguageVersion langVersion) + { + string source = +@" +(name: scoped int a, var d) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.NameColon); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "name"); + } + N(SyntaxKind.ColonToken); + } + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "d"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_31(LanguageVersion langVersion) + { + string source = +@" +(var a, scoped int b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_32(LanguageVersion langVersion) + { + string source = +@" +(var a, name: scoped int b) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.NameColon); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "name"); + } + N(SyntaxKind.ColonToken); + } + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void DeclExpr_33(LanguageVersion langVersion) + { + string source = +@" +(var a, scoped var (b, c)) = M; +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,16): error CS1026: ) expected + // (var a, scoped var (b, c)) = M; + Diagnostic(ErrorCode.ERR_CloseParenExpected, "var").WithLocation(2, 16), + // (2,16): error CS1002: ; expected + // (var a, scoped var (b, c)) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(2, 16), + // (2,26): error CS1002: ; expected + // (var a, scoped var (b, c)) = M; + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 26), + // (2,26): error CS1022: Type or namespace definition, or end-of-file expected + // (var a, scoped var (b, c)) = M; + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 26), + // (2,28): error CS1525: Invalid expression term '=' + // (var a, scoped var (b, c)) = M; + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "=").WithArguments("=").WithLocation(2, 28) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.TupleExpression); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CloseParenToken); + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.SimpleAssignmentExpression); + { + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + N(SyntaxKind.EqualsToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_01(LanguageVersion langVersion) + { + string source = +@" +M(out scoped a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_02(LanguageVersion langVersion) + { + string source = +@" +M(out ref scoped b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_03(LanguageVersion langVersion) + { + string source = +@" +M(out ref scoped int b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,7): error CS1525: Invalid expression term 'ref' + // M(out ref scoped int b); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref scoped").WithArguments("ref").WithLocation(2, 7), + // (2,18): error CS1003: Syntax error, ',' expected + // M(out ref scoped int b); + Diagnostic(ErrorCode.ERR_SyntaxError, "int").WithArguments(",").WithLocation(2, 18), + // (2,18): error CS1525: Invalid expression term 'int' + // M(out ref scoped int b); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 18), + // (2,22): error CS1003: Syntax error, ',' expected + // M(out ref scoped int b); + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 22) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_04(LanguageVersion langVersion) + { + string source = +@" +M(out ref scoped a b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,20): error CS1003: Syntax error, ',' expected + // M(out ref scoped a b); + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 20) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_05(LanguageVersion langVersion) + { + string source = +@" +M(out ref readonly scoped c); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_06(LanguageVersion langVersion) + { + string source = +@" +M(out ref readonly scoped int c); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,7): error CS1525: Invalid expression term 'ref' + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref ").WithArguments("ref").WithLocation(2, 7), + // (2,11): error CS1525: Invalid expression term 'readonly' + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "readonly").WithArguments("readonly").WithLocation(2, 11), + // (2,11): error CS1026: ) expected + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_CloseParenExpected, "readonly").WithLocation(2, 11), + // (2,11): error CS1002: ; expected + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_SemicolonExpected, "readonly").WithLocation(2, 11), + // (2,11): error CS0106: The modifier 'readonly' is not valid for this item + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_BadMemberFlag, "readonly").WithArguments("readonly").WithLocation(2, 11), + // (2,32): error CS1002: ; expected + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 32), + // (2,32): error CS1022: Type or namespace definition, or end-of-file expected + // M(out ref readonly scoped int c); + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 32) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + } + } + M(SyntaxKind.CloseParenToken); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.EmptyStatement); + { + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_07(LanguageVersion langVersion) + { + string source = +@" +M(out ref scoped readonly int c); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,7): error CS1525: Invalid expression term 'ref' + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "ref scoped").WithArguments("ref").WithLocation(2, 7), + // (2,18): error CS1026: ) expected + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_CloseParenExpected, "readonly").WithLocation(2, 18), + // (2,18): error CS1002: ; expected + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_SemicolonExpected, "readonly").WithLocation(2, 18), + // (2,18): error CS0106: The modifier 'readonly' is not valid for this item + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_BadMemberFlag, "readonly").WithArguments("readonly").WithLocation(2, 18), + // (2,32): error CS1002: ; expected + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 32), + // (2,32): error CS1022: Type or namespace definition, or end-of-file expected + // M(out ref scoped readonly int c); + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 32) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.RefExpression); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + } + M(SyntaxKind.CloseParenToken); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.EmptyStatement); + { + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_08(LanguageVersion langVersion) + { + string source = +@" +M(out scoped int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_09(LanguageVersion langVersion) + { + string source = +@" +M(out @scoped int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,15): error CS1003: Syntax error, ',' expected + // M(out @scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "int").WithArguments(",").WithLocation(2, 15), + // (2,15): error CS1525: Invalid expression term 'int' + // M(out @scoped int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 15), + // (2,19): error CS1003: Syntax error, ',' expected + // M(out @scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 19) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_10(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref int b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_11(LanguageVersion langVersion) + { + string source = +@" +M(out @scoped ref int b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,15): error CS1003: Syntax error, ',' expected + // M(out @scoped ref int b); + Diagnostic(ErrorCode.ERR_SyntaxError, "ref").WithArguments(",").WithLocation(2, 15), + // (2,19): error CS1525: Invalid expression term 'int' + // M(out @scoped ref int b); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 19), + // (2,23): error CS1003: Syntax error, ',' expected + // M(out @scoped ref int b); + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 23) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_12(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref readonly int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_13(LanguageVersion langVersion) + { + string source = +@" +M(out @scoped ref readonly int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,15): error CS1003: Syntax error, ',' expected + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "ref").WithArguments(",").WithLocation(2, 15), + // (2,19): error CS1525: Invalid expression term 'readonly' + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "readonly").WithArguments("readonly").WithLocation(2, 19), + // (2,19): error CS1026: ) expected + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_CloseParenExpected, "readonly").WithLocation(2, 19), + // (2,19): error CS1002: ; expected + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_SemicolonExpected, "readonly").WithLocation(2, 19), + // (2,19): error CS0106: The modifier 'readonly' is not valid for this item + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_BadMemberFlag, "readonly").WithArguments("readonly").WithLocation(2, 19), + // (2,33): error CS1002: ; expected + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_SemicolonExpected, ")").WithLocation(2, 33), + // (2,33): error CS1022: Type or namespace definition, or end-of-file expected + // M(out @scoped ref readonly int a); + Diagnostic(ErrorCode.ERR_EOFExpected, ")").WithLocation(2, 33) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "@scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + } + M(SyntaxKind.CloseParenToken); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.LocalDeclarationStatement); + { + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.VariableDeclaration); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + N(SyntaxKind.VariableDeclarator); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + M(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.EmptyStatement); + { + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_14(LanguageVersion langVersion) + { + string source = +@" +M(out scoped S a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_15(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref S b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_16(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref readonly S a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_17(LanguageVersion langVersion) + { + string source = +@" +M(out scoped.nested a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.QualifiedName); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.DotToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "nested"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_18(LanguageVersion langVersion) + { + string source = +@" +M(out scoped scoped a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_20(LanguageVersion langVersion) + { + string source = +@" +M(out scoped var a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_21(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref var b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_22(LanguageVersion langVersion) + { + string source = +@" +M(out scoped ref readonly var c); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.ReadOnlyKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "c"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_23(LanguageVersion langVersion) + { + string source = +@" +M(out scoped var); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_24(LanguageVersion langVersion) + { + string source = +@" +M(out ref scoped var); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.RefType); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_25(LanguageVersion langVersion) + { + string source = +@" +M(out scoped scoped int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,21): error CS1003: Syntax error, ',' expected + // M(out scoped scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "int").WithArguments(",").WithLocation(2, 21), + // (2,21): error CS1525: Invalid expression term 'int' + // M(out scoped scoped int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 21), + // (2,25): error CS1003: Syntax error, ',' expected + // M(out scoped scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 25) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_26(LanguageVersion langVersion) + { + string source = +@" +M(out scoped scoped var b); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,25): error CS1003: Syntax error, ',' expected + // M(out scoped scoped var b); + Diagnostic(ErrorCode.ERR_SyntaxError, "b").WithArguments(",").WithLocation(2, 25) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "b"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_27(LanguageVersion langVersion) + { + string source = +@" +M(ref out scoped int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,7): error CS1525: Invalid expression term 'out' + // M(ref out scoped int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "out").WithArguments("out").WithLocation(2, 7), + // (2,7): error CS1003: Syntax error, ',' expected + // M(ref out scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "out").WithArguments(",").WithLocation(2, 7) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_28(LanguageVersion langVersion) + { + string source = +@" +M(scoped int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1003: Syntax error, ',' expected + // M(scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "int").WithArguments(",").WithLocation(2, 10), + // (2,10): error CS1525: Invalid expression term 'int' + // M(scoped int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 10), + // (2,14): error CS1003: Syntax error, ',' expected + // M(scoped int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 14) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_29(LanguageVersion langVersion) + { + string source = +@" +M(scoped ref int a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1003: Syntax error, ',' expected + // M(scoped ref int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "ref").WithArguments(",").WithLocation(2, 10), + // (2,14): error CS1525: Invalid expression term 'int' + // M(scoped ref int a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "int").WithArguments("int").WithLocation(2, 14), + // (2,18): error CS1003: Syntax error, ',' expected + // M(scoped ref int a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 18) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.PredefinedType); + { + N(SyntaxKind.IntKeyword); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_30(LanguageVersion langVersion) + { + string source = +@" +M(ref out scoped S a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,7): error CS1525: Invalid expression term 'out' + // M(ref out scoped S a); + Diagnostic(ErrorCode.ERR_InvalidExprTerm, "out").WithArguments("out").WithLocation(2, 7), + // (2,7): error CS1003: Syntax error, ',' expected + // M(ref out scoped S a); + Diagnostic(ErrorCode.ERR_SyntaxError, "out").WithArguments(",").WithLocation(2, 7) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + M(SyntaxKind.IdentifierName); + { + M(SyntaxKind.IdentifierToken); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + N(SyntaxKind.SingleVariableDesignation); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_31(LanguageVersion langVersion) + { + string source = +@" +M(scoped S a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1003: Syntax error, ',' expected + // M(scoped S a); + Diagnostic(ErrorCode.ERR_SyntaxError, "S").WithArguments(",").WithLocation(2, 10), + // (2,12): error CS1003: Syntax error, ',' expected + // M(scoped S a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 12) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_32(LanguageVersion langVersion) + { + string source = +@" +M(scoped ref S a); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion), + // (2,10): error CS1003: Syntax error, ',' expected + // M(scoped ref S a); + Diagnostic(ErrorCode.ERR_SyntaxError, "ref").WithArguments(",").WithLocation(2, 10), + // (2,16): error CS1003: Syntax error, ',' expected + // M(scoped ref S a); + Diagnostic(ErrorCode.ERR_SyntaxError, "a").WithArguments(",").WithLocation(2, 16) + ); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.RefKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "S"); + } + } + M(SyntaxKind.CommaToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "a"); + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_33(LanguageVersion langVersion) + { + string source = +@" +M(out scoped var _); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.ScopedType); + { + N(SyntaxKind.ScopedKeyword); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "var"); + } + } + N(SyntaxKind.DiscardDesignation); + { + N(SyntaxKind.UnderscoreToken); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + + [Theory] + [InlineData(LanguageVersion.CSharp10)] + [InlineData(LanguageVersion.CSharp11)] + public void OutDeclExpr_34(LanguageVersion langVersion) + { + string source = +@" +M(out scoped _); +"; + UsingTree(source, TestOptions.Regular.WithLanguageVersion(langVersion)); + + N(SyntaxKind.CompilationUnit); + { + N(SyntaxKind.GlobalStatement); + { + N(SyntaxKind.ExpressionStatement); + { + N(SyntaxKind.InvocationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "M"); + } + N(SyntaxKind.ArgumentList); + { + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.Argument); + { + N(SyntaxKind.OutKeyword); + N(SyntaxKind.DeclarationExpression); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "scoped"); + } + N(SyntaxKind.DiscardDesignation); + { + N(SyntaxKind.UnderscoreToken); + } + } + } + N(SyntaxKind.CloseParenToken); + } + } + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.EndOfFileToken); + } + EOF(); + } + [Theory] [InlineData(LanguageVersion.CSharp10)] [InlineData(LanguageVersion.CSharp11)]