提交 b3eb0b67 编写于 作者: C Charles Stoner

Use default tuple fields in conversion since fields from inferred names

are marked not usable in C#7
上级 d67a95f1
......@@ -650,16 +650,8 @@ private BoundExpression MakeImplicitConversion(BoundExpression rewrittenOperand,
for (int i = 0; i < numElements; i++)
{
var field = srcElementFields[i];
DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
{
Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, syntax.Location);
}
var fieldAccess = MakeTupleFieldAccess(syntax, field, savedTuple, null, LookupResultKind.Empty);
var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
var convertedFieldAccess = MakeConversionNode(syntax, fieldAccess, elementConversions[i], destElementTypes[i], @checked, explicitCastInCode);
fieldAccessorsBuilder.Add(convertedFieldAccess);
}
......
......@@ -221,18 +221,7 @@ private static bool IsTupleExpression(BoundKind kind)
var builder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
for (int i = 0; i < numElements; i++)
{
var field = fields[i];
// Use default field rather than implicitly named fields since
// fields from inferred names are not usable in C# 7.0.
field = field.CorrespondingTupleField ?? field;
DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
{
Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, expression.Syntax.Location);
}
var fieldAccess = MakeTupleFieldAccess(expression.Syntax, field, tuple, null, LookupResultKind.Empty);
var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(tuple, expression.Syntax, fields[i]);
builder.Add(fieldAccess);
}
return builder.ToImmutableAndFree();
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CSharp.Symbols;
using System.Diagnostics;
namespace Microsoft.CodeAnalysis.CSharp
{
......@@ -90,5 +89,20 @@ public override BoundNode VisitFieldAccess(BoundFieldAccess node)
// make a field access for the most local access
return _factory.Field(rewrittenReceiver, underlyingField);
}
private BoundExpression MakeTupleFieldAccessAndReportUseSiteDiagnostics(BoundExpression tuple, SyntaxNode syntax, FieldSymbol field)
{
// Use default field rather than implicitly named fields since
// fields from inferred names are not usable in C# 7.0.
field = field.CorrespondingTupleField ?? field;
DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
{
Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, syntax.Location);
}
return MakeTupleFieldAccess(syntax, field, tuple, null, LookupResultKind.Empty);
}
}
}
......@@ -3938,6 +3938,29 @@ static class Extension
verifier7_1.VerifyDiagnostics();
}
[WorkItem(21518, "https://github.com/dotnet/roslyn/issues/21518")]
[Fact]
public void InferredName_Conversion()
{
var source =
@"using System.Collections.Generic;
class C
{
static void F((int, IList<object>) items)
{
}
static void Test()
{
var items = new List<object>();
var group = (1, items);
F(group);
}
}";
var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp7),
references: new[] { MscorlibRef, ValueTupleRef, SystemRuntimeFacadeRef, SystemCoreRef });
comp.VerifyEmitDiagnostics();
}
[Fact]
public void LongTupleWithArgumentEvaluation()
{
......
......@@ -6277,6 +6277,28 @@ BC37289: Tuple element name 'M' is inferred. Please use language version 15.3 or
verifier15_3.VerifyDiagnostics()
End Sub
<Fact>
Public Sub InferredName_Conversion()
Dim source = <compilation>
<file>
Imports System.Collections.Generic
Class C
Shared Sub F(items As (Integer, IList(Of Object)))
End Sub
Shared Sub Test()
Dim items = New List(Of Object)()
Dim group = (1, items)
F(group)
End Sub
End Class
</file>
</compilation>
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(source,
additionalRefs:={ValueTupleRef, SystemRuntimeFacadeRef, SystemCoreRef},
parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15))
comp.AssertTheseEmitDiagnostics(<errors/>)
End Sub
<Fact>
Public Sub LongTupleWithArgumentEvaluation()
......@@ -7564,7 +7586,7 @@ BC36625: Lambda expression cannot be converted to 'Integer' because 'Integer' is
End Sub
<Fact>
Public Sub TupleInferredLambdStrictOn()
Public Sub TupleInferredLambdaStrictOn()
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
......@@ -7600,7 +7622,7 @@ BC36642: Option Strict On requires each lambda expression parameter to be declar
End Sub
<Fact()>
Public Sub TupleInferredLambdStrictOff()
Public Sub TupleInferredLambdaStrictOff()
Dim verifier = CompileAndVerify(
<compilation>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册