From 599022844406d0d3fe32f97d5f5d9e6a8d21b103 Mon Sep 17 00:00:00 2001 From: Charles Stoner Date: Thu, 20 Feb 2020 10:13:16 -0800 Subject: [PATCH] Avoid use-site diagnostics in TupleTypeDecoder (#41701) --- .../Symbols/Metadata/PE/TupleTypeDecoder.cs | 6 ++-- .../Test/Emit/CodeGen/CodeGenTupleTest.cs | 30 +++++++++++++++++ .../Symbols/Metadata/PE/TupleTypeDecoder.vb | 5 +-- .../Test/Emit/CodeGen/CodeGenTuples.vb | 33 +++++++++++++++++++ 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/TupleTypeDecoder.cs b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/TupleTypeDecoder.cs index c21c0b38afe34..b7c9864af2b2c 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/TupleTypeDecoder.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/TupleTypeDecoder.cs @@ -159,11 +159,9 @@ private TypeSymbol DecodeType(TypeSymbol type) switch (type.Kind) { case SymbolKind.ErrorType: - if (type.HasUseSiteError) - { - _foundUsableErrorType = true; - } + _foundUsableErrorType = true; return type; + case SymbolKind.DynamicType: case SymbolKind.TypeParameter: case SymbolKind.PointerType: diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs index b9055d66ba376..6e3ddede3389d 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs @@ -26095,6 +26095,36 @@ public static void Main() CompileAndVerify(executeComp, expectedOutput: "ran"); } + [Fact] + [WorkItem(41699, "https://github.com/dotnet/roslyn/issues/41699")] + public void MissingBaseType_TupleTypeArgumentWithNames() + { + var sourceA = +@"public class A { }"; + var comp = CreateCompilation(sourceA, assemblyName: "A"); + var refA = comp.EmitToImageReference(); + + var sourceB = +@"public class B : A<(object X, B Y)> { }"; + comp = CreateCompilation(sourceB, references: new[] { refA }); + var refB = comp.EmitToImageReference(); + + var sourceC = +@"class Program +{ + static void Main() + { + var b = new B(); + b.ToString(); + } +}"; + comp = CreateCompilation(sourceC, references: new[] { refB }); + comp.VerifyDiagnostics( + // (6,11): error CS0012: The type 'A<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. + // b.ToString(); + Diagnostic(ErrorCode.ERR_NoTypeDef, "ToString").WithArguments("A<>", "A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 11)); + } + [Fact] [WorkItem(21727, "https://github.com/dotnet/roslyn/issues/21727")] public void FailedDecodingOfTupleNamesWhenMissingValueTupleType() diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/TupleTypeDecoder.vb b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/TupleTypeDecoder.vb index 14ea3d2bac61e..b8a4abba2c2b3 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/TupleTypeDecoder.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/TupleTypeDecoder.vb @@ -126,10 +126,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE Private Function DecodeType(type As TypeSymbol) As TypeSymbol Select Case type.Kind Case SymbolKind.ErrorType - - If type.GetUseSiteErrorInfo() IsNot Nothing Then - _foundUsableErrorType = True - End If + _foundUsableErrorType = True Return type Case SymbolKind.DynamicType, diff --git a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb index d34d3cbd951aa..7af45489db9cf 100644 --- a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb +++ b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb @@ -22800,6 +22800,39 @@ End Class End Sub + + + Public Sub MissingBaseType_TupleTypeArgumentWithNames() + Dim sourceA = +"Public Class A(Of T) +End Class" + Dim comp = CreateCompilation(sourceA, assemblyName:="A") + Dim refA = comp.EmitToImageReference() + + Dim sourceB = +"Public Class B + Inherits A(Of (X As Object, Y As B)) +End Class" + comp = CreateCompilation(sourceB, references:={refA}) + Dim refB = comp.EmitToImageReference() + + Dim sourceC = +"Module Program + Sub Main() + Dim b = New B() + b.ToString() + End Sub +End Module" + comp = CreateCompilation(sourceC, references:={refB}) + comp.AssertTheseDiagnostics( +"BC30456: 'ToString' is not a member of 'B'. + b.ToString() + ~~~~~~~~~~ +BC30652: Reference required to assembly 'A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' containing the type 'A(Of )'. Add one to your project. + b.ToString() + ~~~~~~~~~~") + End Sub +