提交 9535544b 编写于 作者: J Julien Couvreur 提交者: GitHub

Fix unbound recursion with const var field in script (#21223)

上级 9d639196
......@@ -455,6 +455,11 @@ internal sealed override TypeSymbol GetFieldType(ConsList<FieldSymbol> fieldsBei
{
diagnosticsForFirstDeclarator.Add(ErrorCode.ERR_ImplicitlyTypedVariableMultipleDeclarator, typeSyntax.Location);
}
else if (this.IsConst && this.ContainingType.IsScriptClass)
{
// For const var in script, we won't try to bind the initializer (case below), as it can lead to an unbound recursion
type = null;
}
else
{
fieldsBeingBound = new ConsList<FieldSymbol>(this, fieldsBeingBound);
......
......@@ -1358,6 +1358,26 @@ public void Errors_03()
);
}
[Fact]
[WorkItem(17779, "https://github.com/dotnet/roslyn/issues/17779")]
public void TestScriptWithConstVar()
{
var script = CreateCompilation(
source: @"string F() => null; const var x = F();",
parseOptions: TestOptions.Script,
options: TestOptions.DebugExe,
references: new MetadataReference[] { TaskFacadeAssembly(), MscorlibRef_v20 });
script.VerifyDiagnostics(
// (1,27): error CS0822: Implicitly-typed variables cannot be constant
// string F() => null; const var x = F();
Diagnostic(ErrorCode.ERR_ImplicitlyTypedVariableCannotBeConst, "var").WithLocation(1, 27),
// (1,35): error CS0120: An object reference is required for the non-static field, method, or property 'F()'
// string F() => null; const var x = F();
Diagnostic(ErrorCode.ERR_ObjectRequired, "F").WithArguments("F()").WithLocation(1, 35)
);
}
private static MemberAccessExpressionSyntax ErrorTestsGetNode(SyntaxTree syntaxTree)
{
var node1 = (CompilationUnitSyntax)syntaxTree.GetRoot();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册