未验证 提交 da60463e 编写于 作者: J Julien Couvreur 提交者: GitHub

Fix crash in GetDeconstructionInfo (#27605)

上级 6c7c773a
......@@ -854,7 +854,11 @@ public override DeconstructionInfo GetDeconstructionInfo(AssignmentExpressionSyn
}
var boundConversion = boundDeconstruction.Right;
Debug.Assert(boundConversion != null || boundDeconstruction.HasAnyErrors);
Debug.Assert(boundConversion != null);
if (boundConversion is null)
{
return default;
}
return new DeconstructionInfo(boundConversion.Conversion);
}
......@@ -869,6 +873,10 @@ public override DeconstructionInfo GetDeconstructionInfo(ForEachVariableStatemen
var boundDeconstruction = boundForEach.DeconstructionOpt;
Debug.Assert(boundDeconstruction != null || boundForEach.HasAnyErrors);
if (boundDeconstruction is null)
{
return default;
}
return new DeconstructionInfo(boundDeconstruction.DeconstructionAssignment.Right.Conversion);
}
......
......@@ -273,6 +273,39 @@ public void Deconstruct(out int a)
Assert.Equal(ConversionKind.NoConversion, defaultInfo.Conversion.Value.Kind);
}
[Fact]
[WorkItem(27520, "https://github.com/dotnet/roslyn/issues/27520")]
public void GetDeconstructionInfoOnIncompleteCode()
{
string source = @"
class C
{
static void M(string s)
{
foreach (char in s) { }
}
}";
var comp = CreateCompilation(source);
comp.VerifyDiagnostics(
// (6,18): error CS1525: Invalid expression term 'char'
// foreach (char in s) { }
Diagnostic(ErrorCode.ERR_InvalidExprTerm, "char").WithArguments("char").WithLocation(6, 18),
// (6,23): error CS0230: Type and identifier are both required in a foreach statement
// foreach (char in s) { }
Diagnostic(ErrorCode.ERR_BadForeachDecl, "in").WithLocation(6, 23)
);
var tree = comp.SyntaxTrees.First();
var model = comp.GetSemanticModel(tree);
var foreachDeconstruction = (ForEachVariableStatementSyntax)tree.FindNodeOrTokenByKind(SyntaxKind.ForEachVariableStatement).AsNode();
Assert.Equal(@"foreach (char in s) { }", foreachDeconstruction.ToString());
var deconstructionInfo = model.GetDeconstructionInfo(foreachDeconstruction);
Assert.Equal(Conversion.NoConversion, deconstructionInfo.Conversion);
Assert.Null(deconstructionInfo.Method);
Assert.Empty(deconstructionInfo.Nested);
}
[Fact]
[WorkItem(15634, "https://github.com/dotnet/roslyn/issues/15634")]
public void DeconstructMustReturnVoid()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册