diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs index edcbab91fbaa9ad941ca1a459e832ffa9d308ad0..907c48e3632a4487162973c3bd1445d48dd961d9 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 705fbeec206bf7c1ad17eb2b8b1078451d4a5c0e..964a0f2587d756fe1cb7f7e39f748962205dd881 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 f5fa58009206d982dcc4a5716a2a30cc74783c09..ac7a3fa1ffed442717f3a4d75ae05e9429d0c7f2 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