From 7b359804a5435384b550dc0771b785fa697fadf3 Mon Sep 17 00:00:00 2001 From: Charles Stoner Date: Mon, 11 May 2020 14:08:18 -0700 Subject: [PATCH] Pass basesBeingResolved to BindTupleType (#44098) --- .../CSharp/Portable/Binder/Binder_Symbols.cs | 6 +-- .../Symbol/Symbols/Source/BaseClassTests.cs | 53 +++++++++++++++++++ .../SymbolsTests/Source/BaseClassTests.vb | 48 +++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs index edcbab91fba..907c48e3632 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs @@ -441,7 +441,7 @@ internal NamespaceOrTypeOrAliasSymbolWithAnnotations BindNamespaceOrTypeOrAliasS case SyntaxKind.TupleType: { var tupleTypeSyntax = (TupleTypeSyntax)syntax; - return TypeWithAnnotations.Create(AreNullableAnnotationsEnabled(tupleTypeSyntax.CloseParenToken), BindTupleType(tupleTypeSyntax, diagnostics)); + return TypeWithAnnotations.Create(AreNullableAnnotationsEnabled(tupleTypeSyntax.CloseParenToken), BindTupleType(tupleTypeSyntax, diagnostics, basesBeingResolved)); } case SyntaxKind.RefType: @@ -596,7 +596,7 @@ NamespaceOrTypeOrAliasSymbolWithAnnotations bindPointer() return type; } - private TypeSymbol BindTupleType(TupleTypeSyntax syntax, DiagnosticBag diagnostics) + private TypeSymbol BindTupleType(TupleTypeSyntax syntax, DiagnosticBag diagnostics, ConsList basesBeingResolved) { int numElements = syntax.Elements.Count; var types = ArrayBuilder.GetInstance(numElements); @@ -611,7 +611,7 @@ private TypeSymbol BindTupleType(TupleTypeSyntax syntax, DiagnosticBag diagnosti { var argumentSyntax = syntax.Elements[i]; - var argumentType = BindType(argumentSyntax.Type, diagnostics); + var argumentType = BindType(argumentSyntax.Type, diagnostics, basesBeingResolved); types.Add(argumentType); string name = null; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/BaseClassTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/BaseClassTests.cs index 705fbeec206..964a0f2587d 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/BaseClassTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/BaseClassTests.cs @@ -2301,5 +2301,58 @@ class F : A.B { } // class E : A.B { } Diagnostic(ErrorCode.ERR_ManagedAddr, "E").WithArguments("Base.C").WithLocation(12, 11)); } + + [Fact] + [WorkItem(1107185, "https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1107185")] + public void Tuple_MissingNestedTypeArgument_01() + { + var source = +@"interface I +{ +} +class A : I<(object, A.B)> +{ +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (4,24): error CS0146: Circular base class dependency involving 'A' and 'A' + // class A : I<(object, A.B)> + Diagnostic(ErrorCode.ERR_CircularBase, "B").WithArguments("A", "A").WithLocation(4, 24)); + } + + [Fact] + [WorkItem(1107185, "https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1107185")] + public void Tuple_MissingNestedTypeArgument_02() + { + var source = +@"class A +{ +} +class B : A<(object, B.C)> +{ +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (4,24): error CS0146: Circular base class dependency involving 'B' and 'B' + // class B : A<(object, B.C)> + Diagnostic(ErrorCode.ERR_CircularBase, "C").WithArguments("B", "B").WithLocation(4, 24)); + } + + [Fact] + public void Tuple_MissingNestedTypeArgument_03() + { + var source = +@"interface I +{ +} +class A : I> +{ +}"; + var comp = CreateCompilation(source); + comp.VerifyDiagnostics( + // (4,41): error CS0146: Circular base class dependency involving 'A' and 'A' + // class A : I> + Diagnostic(ErrorCode.ERR_CircularBase, "B").WithArguments("A", "A").WithLocation(4, 41)); + } } } diff --git a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Source/BaseClassTests.vb b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Source/BaseClassTests.vb index f5fa5800920..ac7a3fa1ffe 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Source/BaseClassTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Source/BaseClassTests.vb @@ -2434,6 +2434,54 @@ BC30296: Interface 'A(Of T)' cannot inherit from itself: ]]>) End Sub + + Public Sub Tuple_MissingNestedTypeArgument_01() + Dim source = +"Interface I(Of T) +End Interface +Class A + Implements I(Of (Object, A.B)) +End Class" + Dim comp = CreateCompilation(source) + comp.AssertTheseDiagnostics() + End Sub + + + Public Sub Tuple_MissingNestedTypeArgument_02() + Dim source = +"Class A(Of T) +End Class +Class B + Inherits A(Of (Object, B.C)) +End Class" + Dim comp = CreateCompilation(source) + comp.AssertTheseDiagnostics() + End Sub + + + Public Sub Tuple_MissingNestedTypeArgument_03() + Dim source = +"Interface I(Of T) +End Interface +Class A + Implements I(Of System.ValueTuple(Of Object, A.B)) +End Class" + Dim comp = CreateCompilation(source) + comp.AssertTheseDiagnostics() + End Sub + End Class End Namespace -- GitLab