提交 da74d1b9 编写于 作者: J Jared Parsons 提交者: GitHub

Merge pull request #13924 from jaredpar/watson

Harden ParseEmbeddedStatement
......@@ -7457,10 +7457,19 @@ private StatementSyntax ParseEmbeddedStatement(bool complexCheck)
statement = this.ParseStatementCore();
}
// The consumers of embedded statements are expecting to receive a non-null statement yet there are
// several error conditions that can lead ParseStatementCore to return null. When that occurs
// create an empty error Statement and return it to the caller.
if (statement == null)
{
Debug.Assert(CurrentToken.Kind != SyntaxKind.SemicolonToken);
statement = SyntaxFactory.EmptyStatement(EatToken(SyntaxKind.SemicolonToken));
}
// An "embedded" statement is simply a statement that is not a labelled
// statement or a declaration statement. Parse a normal statement and post-
// check for the error case.
switch (statement?.Kind)
switch (statement.Kind)
{
case SyntaxKind.LabeledStatement:
case SyntaxKind.LocalDeclarationStatement:
......
......@@ -2623,6 +2623,40 @@ static void Test(int arg1, (byte, byte) arg2)
Assert.Equal(false, tree.GetRoot().ContainsDiagnostics);
}
[Fact]
[WorkItem(684860, "https://devdiv.visualstudio.com/DevDiv/_workitems/edit/266237")]
public void DevDiv266237()
{
var source = @"
class Program
{
static void Go()
{
using (var p = new P
{
}
protected override void M()
{
}
}
";
var tree = SyntaxFactory.ParseSyntaxTree(source, options: TestOptions.Regular);
tree.GetDiagnostics(tree.GetRoot()).Verify(
// (9,10): error CS1026: ) expected
// }
CSharpTestBase.Diagnostic(ErrorCode.ERR_CloseParenExpected, "").WithLocation(9, 10),
// (9,10): error CS1002: ; expected
// }
CSharpTestBase.Diagnostic(ErrorCode.ERR_SemicolonExpected, "").WithLocation(9, 10),
// (9,10): error CS1513: } expected
// }
CSharpTestBase.Diagnostic(ErrorCode.ERR_RbraceExpected, "").WithLocation(9, 10));
}
private sealed class TokenAndTriviaWalker : CSharpSyntaxWalker
{
public int Tokens;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册