提交 fdb1a772 编写于 作者: O Omar Tawfik 提交者: GitHub

Merge pull request #14373 from OmarTawfik/fix-14287-const-tuple-deconstruction

Forbid modifiers on a deconstuction declaration
......@@ -608,7 +608,19 @@ private static void FlattenDeconstructVariables(ArrayBuilder<DeconstructionVaria
internal BoundLocalDeconstructionDeclaration BindDeconstructionDeclarationStatement(DeconstructionDeclarationStatementSyntax node, DiagnosticBag diagnostics)
{
return new BoundLocalDeconstructionDeclaration(node, BindDeconstructionDeclaration(node, node.Assignment.VariableComponent, node.Assignment.Value, diagnostics));
bool modifierErrors;
// No modifiers are allowed in deconstruction declarations
ModifierUtils.MakeAndCheckNontypeMemberModifiers(
modifiers: node.Modifiers,
defaultAccess: DeclarationModifiers.None,
allowedModifiers: DeclarationModifiers.None,
errorLocation: node.Assignment.VariableComponent.Location,
diagnostics: diagnostics,
modifierErrors: out modifierErrors);
var assignment = BindDeconstructionDeclaration(node, node.Assignment.VariableComponent, node.Assignment.Value, diagnostics);
return new BoundLocalDeconstructionDeclaration(node, assignment, hasErrors: modifierErrors);
}
internal BoundDeconstructionAssignmentOperator BindDeconstructionDeclaration(CSharpSyntaxNode node, VariableComponentSyntax declaration, ExpressionSyntax right,
......
......@@ -2546,5 +2546,46 @@ static void M((int, int) t)
}
}
[Fact, WorkItem(14287, "https://github.com/dotnet/roslyn/issues/14287")]
public void TupleDeconstructionStatementWithTypesCannotBeConst()
{
string source = @"
class C
{
static void Main()
{
const (int x, int y) = (1, 2);
}
}
";
var comp = CreateCompilationWithMscorlib(source, references: new[] { ValueTupleRef, SystemRuntimeFacadeRef });
comp.VerifyDiagnostics(
// (6,15): error CS0106: The modifier 'const' is not valid for this item
// const (int x, int y) = (1, 2);
Diagnostic(ErrorCode.ERR_BadMemberFlag, "(int x, int y)").WithArguments("const").WithLocation(6, 15)
);
}
[Fact, WorkItem(14287, "https://github.com/dotnet/roslyn/issues/14287")]
public void TupleDeconstructionStatementWithoutTypesCannotBeConst()
{
string source = @"
class C
{
static void Main()
{
const var (x, y) = (1, 2);
}
}
";
var comp = CreateCompilationWithMscorlib(source, references: new[] { ValueTupleRef, SystemRuntimeFacadeRef });
comp.VerifyDiagnostics(
// (6,15): error CS0106: The modifier 'const' is not valid for this item
// const var (x, y) = (1, 2);
Diagnostic(ErrorCode.ERR_BadMemberFlag, "var (x, y)").WithArguments("const").WithLocation(6, 15)
);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册