/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Semantic/Semantics/UseSiteErrorTests.cs
3 846 строк
197 KB
Stephan Bauer
Add friendlier error message on an explicit implementation when the return type is wrong (#80376)
26 сен 2025, 22:14
Не верифицирован
26 сен 2025, 22:14
ced1f68
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.Test.Utilities; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests { /// <summary> /// Tests related to use site errors. /// </summary> public class UseSiteErrorTests : CSharpTestBase { [Fact] public void TestFields() { var text = @" public class C { public CSharpErrors.Subclass1 Field; }"; CompileWithMissingReference(text).VerifyDiagnostics(); } [Fact] public void TestOverrideMethodReturnType() { var text = @" class C : CSharpErrors.ClassMethods { public override UnavailableClass ReturnType1() { return null; } public override UnavailableClass[] ReturnType2() { return null; } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass ReturnType1() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (5,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (4,38): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass ReturnType1() { return null; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,40): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverrideMethodReturnTypeModOpt() { var text = @" class C : ILErrors.ClassMethods { public override int ReturnType1() { return 0; } public override int[] ReturnType2() { return null; } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int ReturnType1() { return 0; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,27): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverrideMethodParameterType() { var text = @" class C : CSharpErrors.ClassMethods { public override void ParameterType1(UnavailableClass x) { } public override void ParameterType2(UnavailableClass[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,41): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override void ParameterType1(UnavailableClass x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (5,41): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override void ParameterType2(UnavailableClass[] x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass")); } [Fact] public void TestOverrideMethodParameterTypeModOpt() { var text = @" class C : ILErrors.ClassMethods { public override void ParameterType1(int x) { } public override void ParameterType2(int[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,26): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override void ParameterType1(int x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,26): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override void ParameterType2(int[] x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestImplicitlyImplementMethod() { var text = @" class C : CSharpErrors.InterfaceMethods { public UnavailableClass ReturnType1() { return null; } public UnavailableClass[] ReturnType2() { return null; } public void ParameterType1(UnavailableClass x) { } public void ParameterType2(UnavailableClass[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (5,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 12), // (6,32): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public void ParameterType1(UnavailableClass x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(6, 32), // (7,32): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public void ParameterType2(UnavailableClass[] x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(7, 32), // (4,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass ReturnType1() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(4, 12), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestImplicitlyImplementMethodModOpt() { var text = @" class C : ILErrors.InterfaceMethods { public int ReturnType1() { return 0; } public int[] ReturnType2() { return null; } public void ParameterType1(int x) { } public void ParameterType2(int[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,16): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int ReturnType1() { return 0; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,18): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (6,17): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public void ParameterType1(int x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,17): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public void ParameterType2(int[] x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestExplicitlyImplementMethod() { var text = @" class C : CSharpErrors.InterfaceMethods { UnavailableClass CSharpErrors.InterfaceMethods.ReturnType1() { return null; } UnavailableClass[] CSharpErrors.InterfaceMethods.ReturnType2() { return null; } void CSharpErrors.InterfaceMethods.ParameterType1(UnavailableClass x) { } void CSharpErrors.InterfaceMethods.ParameterType2(UnavailableClass[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (5,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass[] CSharpErrors.InterfaceMethods.ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 5), // (5,54): error CS9334: 'C.ReturnType2()': return type must be 'UnavailableClass[]' to match implemented member 'InterfaceMethods.ReturnType2()' // UnavailableClass[] CSharpErrors.InterfaceMethods.ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberReturnTypeMismatch, "ReturnType2").WithArguments("C.ReturnType2()", "UnavailableClass[]", "CSharpErrors.InterfaceMethods.ReturnType2()").WithLocation(5, 54), // (6,55): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // void CSharpErrors.InterfaceMethods.ParameterType1(UnavailableClass x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(6, 55), // (6,40): error CS0539: 'C.ParameterType1(UnavailableClass)' in explicit interface declaration is not a member of interface // void CSharpErrors.InterfaceMethods.ParameterType1(UnavailableClass x) { } Diagnostic(ErrorCode.ERR_InterfaceMemberNotFound, "ParameterType1").WithArguments("C.ParameterType1(UnavailableClass)").WithLocation(6, 40), // (7,55): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // void CSharpErrors.InterfaceMethods.ParameterType2(UnavailableClass[] x) { } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(7, 55), // (7,40): error CS0539: 'C.ParameterType2(UnavailableClass[])' in explicit interface declaration is not a member of interface // void CSharpErrors.InterfaceMethods.ParameterType2(UnavailableClass[] x) { } Diagnostic(ErrorCode.ERR_InterfaceMemberNotFound, "ParameterType2").WithArguments("C.ParameterType2(UnavailableClass[])").WithLocation(7, 40), // (4,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass CSharpErrors.InterfaceMethods.ReturnType1() { return null; } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(4, 5), // (4,52): error CS9334: 'C.ReturnType1()': return type must be 'UnavailableClass' to match implemented member 'InterfaceMethods.ReturnType1()' // UnavailableClass CSharpErrors.InterfaceMethods.ReturnType1() { return null; } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberReturnTypeMismatch, "ReturnType1").WithArguments("C.ReturnType1()", "UnavailableClass", "CSharpErrors.InterfaceMethods.ReturnType1()").WithLocation(4, 52), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceMethods Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceMethods").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestExplicitlyImplementMethodModOpt() { var text = @" class C : ILErrors.InterfaceMethods { int ILErrors.InterfaceMethods.ReturnType1() { return 0; } int[] ILErrors.InterfaceMethods.ReturnType2() { return null; } void ILErrors.InterfaceMethods.ParameterType1(int x) { } void ILErrors.InterfaceMethods.ParameterType2(int[] x) { } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,16): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int ReturnType1() { return 0; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,18): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] ReturnType2() { return null; } Diagnostic(ErrorCode.ERR_NoTypeDef, "ReturnType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (6,17): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public void ParameterType1(int x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,17): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public void ParameterType2(int[] x) { } Diagnostic(ErrorCode.ERR_NoTypeDef, "ParameterType2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverridePropertyType() { var text = @" class C : CSharpErrors.ClassProperties { public override UnavailableClass Get1 { get { return null; } } public override UnavailableClass[] Get2 { get { return null; } } public override UnavailableClass Set1 { set { } } public override UnavailableClass[] Set2 { set { } } public override UnavailableClass GetSet1 { get { return null; } set { } } public override UnavailableClass[] GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass Get1 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (5,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass[] Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (7,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass Set1 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (8,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass[] Set2 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (10,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass GetSet1 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (11,21): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override UnavailableClass[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (4,38): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass Get1 { get { return null; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Get1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,40): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass[] Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Get2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,38): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass Set1 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Set1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (8,40): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass[] Set2 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Set2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (10,38): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass GetSet1 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,40): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override UnavailableClass[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverridePropertyTypeModOpt() { var text = @" class C : ILErrors.ClassProperties { public override int Get1 { get { return 0; } } public override int[] Get2 { get { return null; } } public override int Set1 { set { } } public override int[] Set2 { set { } } public override int GetSet1 { get { return 0; } set { } } public override int[] GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int Get1 { get { return 0; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Get1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,27): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int[] Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Get2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int Set1 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Set1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (8,27): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int[] Set2 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "Set2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (10,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int GetSet1 { get { return 0; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,27): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override int[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestImplicitlyImplementProperty() { var text = @" class C : CSharpErrors.InterfaceProperties { public UnavailableClass Get1 { get { return null; } } public UnavailableClass[] Get2 { get { return null; } } public UnavailableClass Set1 { set { } } public UnavailableClass[] Set2 { set { } } public UnavailableClass GetSet1 { get { return null; } set { } } public UnavailableClass[] GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (5,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass[] Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 12), // (7,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass Set1 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(7, 12), // (8,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass[] Set2 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(8, 12), // (10,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass GetSet1 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(10, 12), // (11,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(11, 12), // (4,12): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public UnavailableClass Get1 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(4, 12), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestImplicitlyImplementPropertyModOpt() { var text = @" class C : ILErrors.InterfaceProperties { public int Get1 { get { return 0; } } public int[] Get2 { get { return null; } } public int Set1 { set { } } public int[] Set2 { set { } } public int GetSet1 { get { return 0; } set { } } public int[] GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (10,44): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int GetSet1 { get { return 0; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,28): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,49): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (4,23): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int Get1 { get { return 0; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,23): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int Set1 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (8,25): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int[] Set2 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (10,26): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public int GetSet1 { get { return 0; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestExplicitlyImplementProperty() { var text = @" class C : CSharpErrors.InterfaceProperties { UnavailableClass CSharpErrors.InterfaceProperties.Get1 { get { return null; } } UnavailableClass[] CSharpErrors.InterfaceProperties.Get2 { get { return null; } } UnavailableClass CSharpErrors.InterfaceProperties.Set1 { set { } } UnavailableClass[] CSharpErrors.InterfaceProperties.Set2 { set { } } UnavailableClass CSharpErrors.InterfaceProperties.GetSet1 { get { return null; } set { } } UnavailableClass[] CSharpErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass CSharpErrors.InterfaceProperties.Get1 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(4, 5), // (4,55): error CS9333: 'C.Get1': type must be 'UnavailableClass' to match implemented member 'InterfaceProperties.Get1' // UnavailableClass CSharpErrors.InterfaceProperties.Get1 { get { return null; } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Get1").WithArguments("C.Get1", "UnavailableClass", "CSharpErrors.InterfaceProperties.Get1").WithLocation(4, 55), // (5,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass[] CSharpErrors.InterfaceProperties.Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 5), // (5,57): error CS9333: 'C.Get2': type must be 'UnavailableClass[]' to match implemented member 'InterfaceProperties.Get2' // UnavailableClass[] CSharpErrors.InterfaceProperties.Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Get2").WithArguments("C.Get2", "UnavailableClass[]", "CSharpErrors.InterfaceProperties.Get2").WithLocation(5, 57), // (7,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass CSharpErrors.InterfaceProperties.Set1 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(7, 5), // (7,55): error CS9333: 'C.Set1': type must be 'UnavailableClass' to match implemented member 'InterfaceProperties.Set1' // UnavailableClass CSharpErrors.InterfaceProperties.Set1 { set { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Set1").WithArguments("C.Set1", "UnavailableClass", "CSharpErrors.InterfaceProperties.Set1").WithLocation(7, 55), // (8,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass[] CSharpErrors.InterfaceProperties.Set2 { set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(8, 5), // (8,57): error CS9333: 'C.Set2': type must be 'UnavailableClass[]' to match implemented member 'InterfaceProperties.Set2' // UnavailableClass[] CSharpErrors.InterfaceProperties.Set2 { set { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Set2").WithArguments("C.Set2", "UnavailableClass[]", "CSharpErrors.InterfaceProperties.Set2").WithLocation(8, 57), // (10,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass CSharpErrors.InterfaceProperties.GetSet1 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(10, 5), // (10,55): error CS9333: 'C.GetSet1': type must be 'UnavailableClass' to match implemented member 'InterfaceProperties.GetSet1' // UnavailableClass CSharpErrors.InterfaceProperties.GetSet1 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "GetSet1").WithArguments("C.GetSet1", "UnavailableClass", "CSharpErrors.InterfaceProperties.GetSet1").WithLocation(10, 55), // (11,5): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // UnavailableClass[] CSharpErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(11, 5), // (11,57): error CS9333: 'C.GetSet2': type must be 'UnavailableClass[]' to match implemented member 'InterfaceProperties.GetSet2' // UnavailableClass[] CSharpErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "GetSet2").WithArguments("C.GetSet2", "UnavailableClass[]", "CSharpErrors.InterfaceProperties.GetSet2").WithLocation(11, 57), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceProperties Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceProperties").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestExplicitlyImplementPropertyModOpt() { var text = @" class C : ILErrors.InterfaceProperties { int ILErrors.InterfaceProperties.Get1 { get { return 0; } } int[] ILErrors.InterfaceProperties.Get2 { get { return null; } } int ILErrors.InterfaceProperties.Set1 { set { } } int[] ILErrors.InterfaceProperties.Set2 { set { } } int ILErrors.InterfaceProperties.GetSet1 { get { return 0; } set { } } int[] ILErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (10,66): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int ILErrors.InterfaceProperties.GetSet1 { get { return 0; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,50): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int[] ILErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (11,71): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int[] ILErrors.InterfaceProperties.GetSet2 { get { return null; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (4,45): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int ILErrors.InterfaceProperties.Get1 { get { return 0; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,47): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int[] ILErrors.InterfaceProperties.Get2 { get { return null; } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (7,45): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int ILErrors.InterfaceProperties.Set1 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (8,47): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int[] ILErrors.InterfaceProperties.Set2 { set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "set").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (10,48): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // int ILErrors.InterfaceProperties.GetSet1 { get { return 0; } set { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "get").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestPropertyAccessorModOpt() { var text = @"class C : ILErrors.ClassProperties { static void M(ILErrors.ClassProperties c) { c.GetSet1 = c.GetSet1; c.GetSet2 = c.GetSet2; c.GetSet3 = c.GetSet3; } void M() { GetSet3 = GetSet3; } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (5,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet1 = c.GetSet1; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(5, 11), // (5,23): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet1 = c.GetSet1; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(5, 23), // (6,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet2 = c.GetSet2; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 11), // (6,23): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet2 = c.GetSet2; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 23), // (7,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet3 = c.GetSet3; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 11), // (7,23): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.GetSet3 = c.GetSet3; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 23), // (11,9): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // GetSet3 = GetSet3; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(11, 9), // (11,19): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // GetSet3 = GetSet3; Diagnostic(ErrorCode.ERR_NoTypeDef, "GetSet3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(11, 19)); } [Fact] public void TestOverrideEventType_FieldLike() { var text = @" class C : CSharpErrors.ClassEvents { public override event UnavailableDelegate Event1; public override event CSharpErrors.EventDelegate<UnavailableClass> Event2; public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3; void UseEvent() { Event1(); Event2(); Event3(); } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,27): error CS0246: The type or namespace name 'UnavailableDelegate' could not be found (are you missing a using directive or an assembly reference?) // public override event UnavailableDelegate Event1; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableDelegate").WithArguments("UnavailableDelegate"), // (5,54): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override event CSharpErrors.EventDelegate<UnavailableClass> Event2; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (6,54): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (4,47): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event UnavailableDelegate Event1; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,72): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event CSharpErrors.EventDelegate<UnavailableClass> Event2; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (6,74): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverrideEventType_Custom() { var text = @" class C : CSharpErrors.ClassEvents { public override event UnavailableDelegate Event1 { add { } remove { } } public override event CSharpErrors.EventDelegate<UnavailableClass> Event2 { add { } remove { } } public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,27): error CS0246: The type or namespace name 'UnavailableDelegate' could not be found (are you missing a using directive or an assembly reference?) // public override event UnavailableDelegate Event1; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableDelegate").WithArguments("UnavailableDelegate"), // (5,54): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override event CSharpErrors.EventDelegate<UnavailableClass> Event2; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (6,54): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass"), // (4,47): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event UnavailableDelegate Event1; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (5,72): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event CSharpErrors.EventDelegate<UnavailableClass> Event2; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event2").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (6,74): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event CSharpErrors.EventDelegate<UnavailableClass[]> Event3; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event3").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverrideEventTypeModOpt_FieldLike() { var text = @" class C : ILErrors.ClassEvents { public override event System.Action<int[]> Event1; void UseEvent() { Event1(null); } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,48): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event System.Action<int[]> Event1; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestOverrideEventTypeModOpt_Custom() { var text = @" class C : ILErrors.ClassEvents { public override event System.Action<int[]> Event1 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,48): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public override event System.Action<int[]> Event1; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestImplicitlyImplementEvent_FieldLike() { var text = @" class C : CSharpErrors.InterfaceEvents { public event UnavailableDelegate Event1 = () => { }; public event CSharpErrors.EventDelegate<UnavailableClass> Event2 = () => { }; public event CSharpErrors.EventDelegate<UnavailableClass[]> Event3 = () => { }; }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,18): error CS0246: The type or namespace name 'UnavailableDelegate' could not be found (are you missing a using directive or an assembly reference?) // public event UnavailableDelegate Event1 = () => { }; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableDelegate").WithArguments("UnavailableDelegate").WithLocation(4, 18), // (5,45): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public event CSharpErrors.EventDelegate<UnavailableClass> Event2 = () => { }; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 45), // (6,45): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public event CSharpErrors.EventDelegate<UnavailableClass[]> Event3 = () => { }; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(6, 45), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestImplicitlyImplementEvent_Custom() { var text = @" class C : CSharpErrors.InterfaceEvents { public event UnavailableDelegate Event1 { add { } remove { } } public event CSharpErrors.EventDelegate<UnavailableClass> Event2 { add { } remove { } } public event CSharpErrors.EventDelegate<UnavailableClass[]> Event3 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,18): error CS0246: The type or namespace name 'UnavailableDelegate' could not be found (are you missing a using directive or an assembly reference?) // public event UnavailableDelegate Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableDelegate").WithArguments("UnavailableDelegate").WithLocation(4, 18), // (5,45): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public event CSharpErrors.EventDelegate<UnavailableClass> Event2 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 45), // (6,45): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // public event CSharpErrors.EventDelegate<UnavailableClass[]> Event3 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(6, 45), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestImplicitlyImplementEventModOpt_FieldLike() { var text = @" class C : ILErrors.InterfaceEvents { public event System.Action<int[]> Event1 = x => { }; }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,39): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public event System.Action<int[]> Event1 = x => { }; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (4,39): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public event System.Action<int[]> Event1 = x => { }; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestImplicitlyImplementEventModOpt_Custom() { var text = @" class C : ILErrors.InterfaceEvents { public event System.Action<int[]> Event1 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,56): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public event System.Action<int[]> Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "remove").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (4,48): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // public event System.Action<int[]> Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "add").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestExplicitlyImplementEvent_Custom() //NB: can't explicitly implement with field-like { var text = @" class C : CSharpErrors.InterfaceEvents { event UnavailableDelegate CSharpErrors.InterfaceEvents.Event1 { add { } remove { } } event CSharpErrors.EventDelegate<UnavailableClass> CSharpErrors.InterfaceEvents.Event2 { add { } remove { } } event CSharpErrors.EventDelegate<UnavailableClass[]> CSharpErrors.InterfaceEvents.Event3 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,11): error CS0246: The type or namespace name 'UnavailableDelegate' could not be found (are you missing a using directive or an assembly reference?) // event UnavailableDelegate CSharpErrors.InterfaceEvents.Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableDelegate").WithArguments("UnavailableDelegate").WithLocation(4, 11), // (4,60): error CS9333: 'C.Event1': type must be 'UnavailableDelegate' to match implemented member 'InterfaceEvents.Event1' // event UnavailableDelegate CSharpErrors.InterfaceEvents.Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Event1").WithArguments("C.Event1", "UnavailableDelegate", "CSharpErrors.InterfaceEvents.Event1").WithLocation(4, 60), // (5,38): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // event CSharpErrors.EventDelegate<UnavailableClass> CSharpErrors.InterfaceEvents.Event2 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(5, 38), // (5,85): error CS9333: 'C.Event2': type must be 'CSharpErrors.EventDelegate<UnavailableClass>' to match implemented member 'InterfaceEvents.Event2' // event CSharpErrors.EventDelegate<UnavailableClass> CSharpErrors.InterfaceEvents.Event2 { add { } remove { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Event2").WithArguments("C.Event2", "CSharpErrors.EventDelegate<UnavailableClass>", "CSharpErrors.InterfaceEvents.Event2").WithLocation(5, 85), // (6,38): error CS0246: The type or namespace name 'UnavailableClass' could not be found (are you missing a using directive or an assembly reference?) // event CSharpErrors.EventDelegate<UnavailableClass[]> CSharpErrors.InterfaceEvents.Event3 { add { } remove { } } Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "UnavailableClass").WithArguments("UnavailableClass").WithLocation(6, 38), // (6,87): error CS9333: 'C.Event3': type must be 'CSharpErrors.EventDelegate<UnavailableClass[]>' to match implemented member 'InterfaceEvents.Event3' // event CSharpErrors.EventDelegate<UnavailableClass[]> CSharpErrors.InterfaceEvents.Event3 { add { } remove { } } Diagnostic(ErrorCode.ERR_ExplicitInterfaceMemberTypeMismatch, "Event3").WithArguments("C.Event3", "CSharpErrors.EventDelegate<UnavailableClass[]>", "CSharpErrors.InterfaceEvents.Event3").WithLocation(6, 87), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11), // (2,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class C : CSharpErrors.InterfaceEvents Diagnostic(ErrorCode.ERR_NoTypeDef, "CSharpErrors.InterfaceEvents").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(2, 11) ); } [Fact] public void TestExplicitlyImplementEventModOpt_Custom() //NB: can't explicitly implement with field-like { var text = @" class C : ILErrors.InterfaceEvents { event System.Action<int[]> ILErrors.InterfaceEvents.Event1 { add { } remove { } } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (4,74): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // event System.Action<int[]> ILErrors.InterfaceEvents.Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "remove").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (4,66): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // event System.Action<int[]> ILErrors.InterfaceEvents.Event1 { add { } remove { } } Diagnostic(ErrorCode.ERR_NoTypeDef, "add").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestEventAccess() { var text = @"class C { static void M(CSharpErrors.ClassEvents c, ILErrors.ClassEvents i) { c.Event1 += null; i.Event1 += null; } }"; CompileWithMissingReference(text).VerifyDiagnostics( // (5,11): error CS0012: The type 'UnavailableDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c.Event1 += null; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableDelegate", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (6,11): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i.Event1 += null; Diagnostic(ErrorCode.ERR_NoTypeDef, "Event1").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void TestDelegatesWithNoInvoke() { var text = @"class C { public static T goo<T>(DelegateWithoutInvoke.DelegateGenericFunctionWithoutInvoke<T> del) { return del(""goo""); // will show ERR_InvalidDelegateType instead of ERR_NoSuchMemberOrExtension } public static void Main() { DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate1 = bar; myDelegate1.Invoke(""goo""); // will show an ERR_NoSuchMemberOrExtension DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate2 = new DelegateWithoutInvoke.DelegateSubWithoutInvoke(myDelegate1); object myDelegate3 = new DelegateWithoutInvoke.DelegateSubWithoutInvoke(bar2); DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate4 = x => System.Console.WriteLine(""Hello World""); object myDelegate6 = new DelegateWithoutInvoke.DelegateFunctionWithoutInvoke( x => ""Hello World""); } public static void bar(string p) { System.Console.WriteLine(""Hello World""); } public static void bar2(int p) { System.Console.WriteLine(""Hello World 2""); } }"; var delegatesWithoutInvokeReference = TestReferences.SymbolsTests.DelegateImplementation.DelegatesWithoutInvoke; CreateCompilation(text, new MetadataReference[] { delegatesWithoutInvokeReference }).VerifyDiagnostics( // (7,16): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateGenericFunctionWithoutInvoke<T>' has no invoke method or an invoke method with a return type or parameter types that are not supported. // return del("goo"); // will show ERR_InvalidDelegateType instead of ERR_NoSuchMemberOrExtension Diagnostic(ErrorCode.ERR_InvalidDelegateType, @"del(""goo"")").WithArguments("DelegateWithoutInvoke.DelegateGenericFunctionWithoutInvoke<T>").WithLocation(7, 16), // (13,70): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' has no invoke method or an invoke method with a return type or parameter types that are not supported. // DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate1 = bar; Diagnostic(ErrorCode.ERR_InvalidDelegateType, "bar").WithArguments("DelegateWithoutInvoke.DelegateSubWithoutInvoke").WithLocation(13, 70), // (14,21): error CS1061: 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' does not contain a definition for 'Invoke' and no accessible extension method 'Invoke' accepting a first argument of type 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' could be found (are you missing a using directive or an assembly reference?) // myDelegate1.Invoke("goo"); // will show an ERR_NoSuchMemberOrExtension Diagnostic(ErrorCode.ERR_NoSuchMemberOrExtension, "Invoke").WithArguments("DelegateWithoutInvoke.DelegateSubWithoutInvoke", "Invoke").WithLocation(14, 21), // (15,70): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' has no invoke method or an invoke method with a return type or parameter types that are not supported. // DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate2 = new DelegateWithoutInvoke.DelegateSubWithoutInvoke(myDelegate1); Diagnostic(ErrorCode.ERR_InvalidDelegateType, "new DelegateWithoutInvoke.DelegateSubWithoutInvoke(myDelegate1)").WithArguments("DelegateWithoutInvoke.DelegateSubWithoutInvoke").WithLocation(15, 70), // (16,30): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' has no invoke method or an invoke method with a return type or parameter types that are not supported. // object myDelegate3 = new DelegateWithoutInvoke.DelegateSubWithoutInvoke(bar2); Diagnostic(ErrorCode.ERR_InvalidDelegateType, "new DelegateWithoutInvoke.DelegateSubWithoutInvoke(bar2)").WithArguments("DelegateWithoutInvoke.DelegateSubWithoutInvoke").WithLocation(16, 30), // (17,72): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateSubWithoutInvoke' has no invoke method or an invoke method with a return type or parameter types that are not supported. // DelegateWithoutInvoke.DelegateSubWithoutInvoke myDelegate4 = x => System.Console.WriteLine("Hello World"); Diagnostic(ErrorCode.ERR_InvalidDelegateType, "=>").WithArguments("DelegateWithoutInvoke.DelegateSubWithoutInvoke").WithLocation(17, 72), // (18,89): error CS7024: Delegate 'DelegateWithoutInvoke.DelegateFunctionWithoutInvoke' has no invoke method or an invoke method with a return type or parameter types that are not supported. // object myDelegate6 = new DelegateWithoutInvoke.DelegateFunctionWithoutInvoke( x => "Hello World"); Diagnostic(ErrorCode.ERR_InvalidDelegateType, "=>").WithArguments("DelegateWithoutInvoke.DelegateFunctionWithoutInvoke").WithLocation(18, 89)); } [Fact] public void TestDelegatesWithUseSiteErrors() { var text = @"class C { public static T goo<T>(CSharpErrors.DelegateParameterType3<T> del) { return del.Invoke(""goo""); } public static void Main() { CSharpErrors.DelegateReturnType1 myDelegate1 = bar; myDelegate1(""goo""); CSharpErrors.DelegateReturnType1 myDelegate2 = new CSharpErrors.DelegateReturnType1(myDelegate1); object myDelegate3 = new CSharpErrors.DelegateReturnType1(bar); CSharpErrors.DelegateReturnType1 myDelegate4 = x => System.Console.WriteLine(""Hello World""); object myDelegate6 = new CSharpErrors.DelegateReturnType1( x => ""Hello World""); } public static void bar(string p) { System.Console.WriteLine(""Hello World""); } public static void bar2(int p) { System.Console.WriteLine(""Hello World 2""); } }"; var csharpAssemblyReference = TestReferences.SymbolsTests.UseSiteErrors.CSharp; var ilAssemblyReference = TestReferences.SymbolsTests.UseSiteErrors.IL; CreateCompilation(text, new MetadataReference[] { csharpAssemblyReference, ilAssemblyReference }).VerifyDiagnostics( // (7,16): error CS0012: The type 'UnavailableClass<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // return del.Invoke("goo"); Diagnostic(ErrorCode.ERR_NoTypeDef, "del.Invoke").WithArguments("UnavailableClass<>", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 16), // (13,56): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // CSharpErrors.DelegateReturnType1 myDelegate1 = bar; Diagnostic(ErrorCode.ERR_NoTypeDef, "bar").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(13, 56), // (14,9): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // myDelegate1("goo"); Diagnostic(ErrorCode.ERR_NoTypeDef, @"myDelegate1(""goo"")").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(14, 9), // (15,56): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // CSharpErrors.DelegateReturnType1 myDelegate2 = new CSharpErrors.DelegateReturnType1(myDelegate1); Diagnostic(ErrorCode.ERR_NoTypeDef, "new CSharpErrors.DelegateReturnType1(myDelegate1)").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(15, 56), // (16,30): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // object myDelegate3 = new CSharpErrors.DelegateReturnType1(bar); Diagnostic(ErrorCode.ERR_NoTypeDef, "new CSharpErrors.DelegateReturnType1(bar)").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(16, 30), // (17,58): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // CSharpErrors.DelegateReturnType1 myDelegate4 = x => System.Console.WriteLine("Hello World"); Diagnostic(ErrorCode.ERR_NoTypeDef, "=>").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(17, 58), // (18,70): error CS0012: The type 'UnavailableClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // object myDelegate6 = new CSharpErrors.DelegateReturnType1( x => "Hello World"); Diagnostic(ErrorCode.ERR_NoTypeDef, "=>").WithArguments("UnavailableClass", "Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(18, 70)); } [Fact, WorkItem(531090, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531090")] public void Constructor() { string delSource = """ using System; public delegate string MyFunc(string arg); """; var delComp = CreateEmptyCompilation( delSource, assemblyName: "Delegate.Util", references: [NetFramework.mscorlib], options: TestOptions.ReleaseDll.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default)); string lib1Source = """ using System; public sealed class A { public A(int a, MyFunc example) {} public A(MyFunc example) {} } """; var lib1Comp = CreateEmptyCompilation( lib1Source, references: [NetFramework.mscorlib, delComp.ToMetadataReference()], TestOptions.ReleaseDll.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default)); string lib2Source = """ class Program { static void Main() { new A(x => x); } } """; var lib2Comp = CreateEmptyCompilation( lib2Source, references: [NetFramework.mscorlib, lib1Comp.ToMetadataReference()], TestOptions.ReleaseDll.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default)); lib2Comp.VerifyDiagnostics( // (5,13): error CS0012: The type 'MyFunc' is defined in an assembly that is not referenced. You must add a reference to assembly 'Delegate.Util, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // new A(x => x); Diagnostic(ErrorCode.ERR_NoTypeDef, "A").WithArguments("MyFunc", "Delegate.Util, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(5, 13)); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void SynthesizedInterfaceImplementation() { var xSource = @" public class X {} "; var xRef = CreateCompilation(xSource, assemblyName: "Test").EmitToImageReference(); var libSource = @" public interface I { void Goo(X a); } public class C { public void Goo(X a) { } } "; var lib = CreateCompilation(libSource, new[] { xRef }, assemblyName: "Test"); var mainSource = @" class B : C, I { } "; var main = CreateCompilation(mainSource, new[] { new CSharpCompilationReference(lib) }, assemblyName: "Main"); main.VerifyDiagnostics( // (2,7): error CS7069: Reference to type 'X' claims it is defined in 'Test', but it could not be found // class B : C, I { } Diagnostic(ErrorCode.ERR_MissingTypeInAssembly, "B").WithArguments("X", "Test").WithLocation(2, 7)); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void NoSynthesizedInterfaceImplementation() { var xSource = @" public class X {} "; var xRef = CreateCompilation(xSource, assemblyName: "X").EmitToImageReference(); var libSource = @" public interface I { void Goo(X a); } public class C { public virtual void Goo(X a) { } } "; var lib = CreateCompilation(libSource, new[] { xRef }, assemblyName: "Lib"); var mainSource = @" class B : C, I { } "; var main = CreateCompilation(mainSource, new[] { new CSharpCompilationReference(lib) }, assemblyName: "Main"); main.VerifyEmitDiagnostics(); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void SynthesizedInterfaceImplementation_Indexer() { var xSource = @" public class X {} "; var xRef = CreateCompilation(xSource, assemblyName: "X").EmitToImageReference(); var libSource = @" public interface I { int this[X a] { get; set; } } public class C { public int this[X a] { get { return 1; } set { } } } "; var lib = CreateCompilation(libSource, new[] { xRef }, assemblyName: "Lib"); var mainSource = @" class B : C, I { } "; var main = CreateCompilation(mainSource, new[] { new CSharpCompilationReference(lib) }, assemblyName: "Main"); main.VerifyDiagnostics( // (2,7): error CS0012: The type 'X' is defined in an assembly that is not referenced. You must add a reference to assembly 'X, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class B : C, I { } Diagnostic(ErrorCode.ERR_NoTypeDef, "B").WithArguments("X", "X, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (2,7): error CS0012: The type 'X' is defined in an assembly that is not referenced. You must add a reference to assembly 'X, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // class B : C, I { } Diagnostic(ErrorCode.ERR_NoTypeDef, "B").WithArguments("X", "X, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void SynthesizedInterfaceImplementation_ModOpt() { var unavailableRef = TestReferences.SymbolsTests.UseSiteErrors.Unavailable; var ilRef = TestReferences.SymbolsTests.UseSiteErrors.IL; var mainSource = @" class B : ILErrors.ClassEventsNonVirtual, ILErrors.InterfaceEvents { } "; var main = CreateCompilation(mainSource, new[] { ilRef, unavailableRef }); CompileAndVerify(main); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void NoSynthesizedInterfaceImplementation_ModOpt() { var unavailableRef = TestReferences.SymbolsTests.UseSiteErrors.Unavailable; var ilRef = TestReferences.SymbolsTests.UseSiteErrors.IL; var mainSource = @" class B : ILErrors.ClassEvents, ILErrors.InterfaceEvents { } "; var main = CreateCompilation(mainSource, new[] { ilRef, unavailableRef }); CompileAndVerify(main); } [Fact, WorkItem(530974, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530974")] public void SynthesizedInterfaceImplementation_ModReq() { var unavailableRef = TestReferences.SymbolsTests.UseSiteErrors.Unavailable; var ilRef = TestReferences.SymbolsTests.UseSiteErrors.IL; var mainSource = @" class B : ILErrors.ModReqClassEventsNonVirtual, ILErrors.ModReqInterfaceEvents { } "; var main = CreateCompilation(mainSource, new[] { ilRef, unavailableRef }); main.VerifyDiagnostics( // (2,7): error CS0570: 'ModReqInterfaceEvents.Event1.remove' is not supported by the language // class B : ILErrors.ModReqClassEventsNonVirtual, ILErrors.ModReqInterfaceEvents { } Diagnostic(ErrorCode.ERR_BindToBogus, "B").WithArguments("ILErrors.ModReqInterfaceEvents.Event1.remove").WithLocation(2, 7), // (2,7): error CS0570: 'ModReqInterfaceEvents.Event1.add' is not supported by the language // class B : ILErrors.ModReqClassEventsNonVirtual, ILErrors.ModReqInterfaceEvents { } Diagnostic(ErrorCode.ERR_BindToBogus, "B").WithArguments("ILErrors.ModReqInterfaceEvents.Event1.add").WithLocation(2, 7) ); } [Fact] public void CompilerGeneratedAttributeNotRequired() { var text = @"class C { public int AProperty { get; set; } }"; var compilation = CreateEmptyCompilation(text).VerifyDiagnostics( // (1,7): error CS0518: Predefined type 'System.Object' is not defined or imported // class C Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "C").WithArguments("System.Object"), // (3,11): error CS0518: Predefined type 'System.Int32' is not defined or imported // public int AProperty { get; set; } Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "int").WithArguments("System.Int32"), // (3,32): error CS0518: Predefined type 'System.Void' is not defined or imported // public int AProperty { get; set; } Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "set;").WithArguments("System.Void"), // (1,7): error CS1729: 'object' does not contain a constructor that takes 0 arguments // class C Diagnostic(ErrorCode.ERR_BadCtorArgCount, "C").WithArguments("object", "0")); foreach (var diag in compilation.GetDiagnostics()) { Assert.DoesNotContain("System.Runtime.CompilerServices.CompilerGeneratedAttribute", diag.GetMessage(), StringComparison.Ordinal); } } [Fact] public void UseSiteErrorsForSwitchSubsumption() { var baseSource = @"public class Base {}"; var baseLib = CreateCompilation(baseSource, assemblyName: "BaseAssembly"); var derivedSource = @"public class Derived : Base {}"; var derivedLib = CreateCompilation(derivedSource, assemblyName: "DerivedAssembly", references: new[] { new CSharpCompilationReference(baseLib) }); var programSource = @" class Program { public static void Main(string[] args) { object o = args; switch (o) { case string s: break; case Derived d: break; } } } "; CreateCompilation(programSource, references: new[] { new CSharpCompilationReference(derivedLib) }).VerifyDiagnostics( // (9,18): error CS0012: The type 'Base' is defined in an assembly that is not referenced. You must add a reference to assembly 'BaseAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // case string s: break; Diagnostic(ErrorCode.ERR_NoTypeDef, "string s").WithArguments("Base", "BaseAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(9, 18) ); } #region Attributes for unsafe code /// <summary> /// Simple test to verify that the infrastructure for the other UnsafeAttributes_* tests works correctly. /// </summary> [Fact] public void UnsafeAttributes_NoErrors() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public enum SecurityAction { RequestMinimum } public class CodeAccessSecurityAttribute : Attribute { public CodeAccessSecurityAttribute(SecurityAction action) { } } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public SecurityPermissionAttribute(SecurityAction action) : base(action) { } public bool SkipVerification { get; set; } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } /// <summary> /// If the attribute type is missing, just skip emitting the attributes. /// No diagnostics. /// </summary> [Fact] public void UnsafeAttributes_MissingUnverifiableCodeAttribute() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public enum SecurityAction { RequestMinimum } public class CodeAccessSecurityAttribute : Attribute { public CodeAccessSecurityAttribute(SecurityAction action) { } } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public SecurityPermissionAttribute(SecurityAction action) : base(action) { } public bool SkipVerification { get; set; } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } /// <summary> /// If the attribute type is missing, just skip emitting the attributes. /// No diagnostics. /// </summary> [Fact] public void UnsafeAttributes_MissingSecurityPermissionAttribute() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public enum SecurityAction { RequestMinimum } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // (19,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } /// <summary> /// If the enum type is missing, just skip emitting the attributes. /// No diagnostics. /// </summary> [Fact] public void UnsafeAttributes_MissingSecurityAction() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public class CodeAccessSecurityAttribute : Attribute { } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public bool SkipVerification { get; set; } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false); CompileUnsafeAttributesAndCheckDiagnostics(text, true); } /// <summary> /// If the attribute constructor is missing, report a use site error. /// </summary> [Fact] public void UnsafeAttributes_MissingUnverifiableCodeAttributeCtorMissing() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { public UnverifiableCodeAttribute(object o1, object o2) { } //wrong signature, won't be found } namespace Permissions { public enum SecurityAction { RequestMinimum } public class CodeAccessSecurityAttribute : Attribute { public CodeAccessSecurityAttribute(SecurityAction action) { } } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public SecurityPermissionAttribute(SecurityAction action) : base(action) { } public bool SkipVerification { get; set; } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // error CS0656: Missing compiler required member 'System.Security.UnverifiableCodeAttribute..ctor' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.UnverifiableCodeAttribute", ".ctor"), // (22,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // error CS0656: Missing compiler required member 'System.Security.UnverifiableCodeAttribute..ctor' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.UnverifiableCodeAttribute", ".ctor"), // (22,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } /// <summary> /// If the attribute constructor is missing, report a use site error. /// </summary> [Fact] public void UnsafeAttributes_SecurityPermissionAttributeCtorMissing() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public enum SecurityAction { RequestMinimum } public class CodeAccessSecurityAttribute : Attribute { public CodeAccessSecurityAttribute(SecurityAction action) { } } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public SecurityPermissionAttribute(SecurityAction action, object o) //extra parameter will fail to match well-known signature : base(action) { } public bool SkipVerification { get; set; } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // error CS0656: Missing compiler required member 'System.Security.Permissions.SecurityPermissionAttribute..ctor' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.Permissions.SecurityPermissionAttribute", ".ctor"), // (21,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // error CS0656: Missing compiler required member 'System.Security.Permissions.SecurityPermissionAttribute..ctor' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.Permissions.SecurityPermissionAttribute", ".ctor"), // (21,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } /// <summary> /// If the attribute property is missing, report a use site error. /// </summary> [Fact] public void UnsafeAttributes_SecurityPermissionAttributePropertyMissing() { var text = unsafeAttributeSystemTypes + @" namespace System.Security { public class UnverifiableCodeAttribute : Attribute { } namespace Permissions { public enum SecurityAction { RequestMinimum } public class CodeAccessSecurityAttribute : Attribute { public CodeAccessSecurityAttribute(SecurityAction action) { } } public class SecurityPermissionAttribute : CodeAccessSecurityAttribute { public SecurityPermissionAttribute(SecurityAction action) : base(action) { } } } } "; CompileUnsafeAttributesAndCheckDiagnostics(text, false, // error CS0656: Missing compiler required member 'System.Security.Permissions.SecurityPermissionAttribute.SkipVerification' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.Permissions.SecurityPermissionAttribute", "SkipVerification"), // (21,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); CompileUnsafeAttributesAndCheckDiagnostics(text, true, // error CS0656: Missing compiler required member 'System.Security.Permissions.SecurityPermissionAttribute.SkipVerification' Diagnostic(ErrorCode.ERR_MissingPredefinedMember).WithArguments("System.Security.Permissions.SecurityPermissionAttribute", "SkipVerification"), // (21,21): error CS0518: Predefined type 'System.Int32' is not defined or imported // public enum SecurityAction Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "SecurityAction").WithArguments("System.Int32")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [Fact] public void OverloadResolutionWithUseSiteErrors() { var missingSource = @" public class Missing { } "; var libSource = @" public class Methods { public static void M1(int x) { } public static void M1(Missing x) { } public static void M2(Missing x) { } public static void M2(int x) { } } public class Indexer1 { public int this[int x] { get { return 0; } } public int this[Missing x] { get { return 0; } } } public class Indexer2 { public int this[Missing x] { get { return 0; } } public int this[int x] { get { return 0; } } } public class Constructor1 { public Constructor1(int x) { } public Constructor1(Missing x) { } } public class Constructor2 { public Constructor2(Missing x) { } public Constructor2(int x) { } } "; var testSource = @" using System; class C { static void Main() { var c1 = new Constructor1(1); var c2 = new Constructor2(2); Methods.M1(1); Methods.M2(2); Action<int> a1 = Methods.M1; Action<int> a2 = Methods.M2; var i1 = new Indexer1()[1]; var i2 = new Indexer2()[2]; } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( // (8,22): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var c1 = new Constructor1(1); Diagnostic(ErrorCode.ERR_NoTypeDef, "Constructor1").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (9,22): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var c2 = new Constructor2(2); Diagnostic(ErrorCode.ERR_NoTypeDef, "Constructor2").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (9,9): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // Methods.M1(1); Diagnostic(ErrorCode.ERR_NoTypeDef, "Methods.M1").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (10,9): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // Methods.M2(2); Diagnostic(ErrorCode.ERR_NoTypeDef, "Methods.M2").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (14,26): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // Action<int> a1 = Methods.M1; Diagnostic(ErrorCode.ERR_NoTypeDef, "Methods.M1").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (15,26): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // Action<int> a2 = Methods.M2; Diagnostic(ErrorCode.ERR_NoTypeDef, "Methods.M2").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (17,18): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var i1 = new Indexer1()[1]; Diagnostic(ErrorCode.ERR_NoTypeDef, "new Indexer1()[1]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (18,18): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var i2 = new Indexer2()[2]; Diagnostic(ErrorCode.ERR_NoTypeDef, "new Indexer2()[2]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [Fact] public void OverloadResolutionWithUseSiteErrors_LessDerived() { var missingSource = @" public class Missing { } "; var libSource = @" public class Base { public int M(int x) { return 0; } public int M(Missing x) { return 0; } public int this[int x] { get { return 0; } } public int this[Missing x] { get { return 0; } } } "; var testSource = @" class Derived : Base { static void Main() { var d = new Derived(); int i; i = d.M(1); i = d.M(""A""); i = d[1]; i = d[""A""]; } public int M(string x) { return 0; } public int this[string x] { get { return 0; } } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef, missingRef }).VerifyDiagnostics(); // NOTE: No errors reported when the Derived member wins. CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( // (9,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = d.M(1); Diagnostic(ErrorCode.ERR_NoTypeDef, "d.M").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (12,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = d[1]; Diagnostic(ErrorCode.ERR_NoTypeDef, "d[1]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [Fact] public void OverloadResolutionWithUseSiteErrors_NoCorrespondingParameter() { var missingSource = @" public class Missing { } "; var libSource = @" public class C { public C(string x, int y = 1) { } public C(Missing x) { } public int M(string x, int y = 1) { return 0; } public int M(Missing x) { return 0; } public int this[string x, int y = 1] { get { return 0; } } public int this[Missing x] { get { return 0; } } } "; var testSource = @" class Test { static void Main() { C c; int i; c = new C(null, 1); // Fine c = new C(""A""); // Error i = c.M(null, 1); // Fine i = c.M(""A""); // Error i = c[null, 1]; // Fine i = c[""A""]; // Error } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef, missingRef }).VerifyDiagnostics(); CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( // (10,17): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c = new C("A"); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (13,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c.M("A"); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "c.M").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (16,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c["A"]; // Error Diagnostic(ErrorCode.ERR_NoTypeDef, @"c[""A""]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [Fact] public void OverloadResolutionWithUseSiteErrors_NameUsedForPositional() { var missingSource = @" public class Missing { } "; var libSource = @" public class C { public C(string x, string y) { } public C(Missing y, string x) { } public int M(string x, string y) { return 0; } public int M(Missing y, string x) { return 0; } public int this[string x, string y] { get { return 0; } } public int this[Missing y, string x] { get { return 0; } } } "; var testSource = @" class Test { static void Main() { C c; int i; c = new C(""A"", y: null); // Fine c = new C(""A"", null); // Error i = c.M(""A"", y: null); // Fine i = c.M(""A"", null); // Error i = c[""A"", y: null]; // Fine i = c[""A"", null]; // Error } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef, missingRef }).VerifyDiagnostics(); CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( // (10,17): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c = new C("A", null); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (13,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c.M("A", null); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "c.M").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (16,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c["A", null]; // Error Diagnostic(ErrorCode.ERR_NoTypeDef, @"c[""A"", null]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [Fact] public void OverloadResolutionWithUseSiteErrors_RequiredParameterMissing() { var missingSource = @" public class Missing { } "; var libSource = @" public class C { public C(string x, object y = null) { } public C(Missing x, string y) { } public int M(string x, object y = null) { return 0; } public int M(Missing x, string y) { return 0; } public int this[string x, object y = null] { get { return 0; } } public int this[Missing x, string y] { get { return 0; } } } "; var testSource = @" class Test { static void Main() { C c; int i; c = new C(null); // Fine c = new C(null, ""A""); // Error i = c.M(null); // Fine i = c.M(null, ""A""); // Error i = c[null]; // Fine i = c[null, ""A""]; // Error } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef, missingRef }).VerifyDiagnostics(); CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( // (10,17): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // c = new C(null, "A"); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (13,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c.M(null, "A"); // Error Diagnostic(ErrorCode.ERR_NoTypeDef, "c.M").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"), // (16,13): error CS0012: The type 'Missing' is defined in an assembly that is not referenced. You must add a reference to assembly 'Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // i = c[null, "A"]; // Error Diagnostic(ErrorCode.ERR_NoTypeDef, @"c[null, ""A""]").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")); } [Fact] public void OverloadResolutionWithUseSiteErrors_WithParamsArguments_ReturnsUseSiteErrors() { var missingSource = @" public class Missing { } "; var libSource = @" public class C { public static Missing GetMissing(params int[] args) { return null; } public static void SetMissing(params Missing[] args) { } public static Missing GetMissing(string firstArgument, params int[] args) { return null; } public static void SetMissing(string firstArgument, params Missing[] args) { } } "; var testSource = @" class Test { static void Main() { C.GetMissing(); C.GetMissing(1, 1); C.SetMissing(); C.GetMissing(string.Empty); C.GetMissing(string.Empty, 1, 1); C.SetMissing(string.Empty); } } "; var missingRef = CreateCompilation(missingSource, assemblyName: "Missing").EmitToImageReference(); var libRef = CreateCompilation(libSource, new[] { missingRef }).EmitToImageReference(); CreateCompilation(testSource, new[] { libRef, missingRef }).VerifyDiagnostics(); var getMissingDiagnostic = Diagnostic(ErrorCode.ERR_NoTypeDef, @"C.GetMissing").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); var setMissingDiagnostic = Diagnostic(ErrorCode.ERR_NoTypeDef, @"C.SetMissing").WithArguments("Missing", "Missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); CreateCompilation(testSource, new[] { libRef /* and not missingRef */ }).VerifyDiagnostics( getMissingDiagnostic, getMissingDiagnostic, setMissingDiagnostic, getMissingDiagnostic, getMissingDiagnostic, setMissingDiagnostic); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [ClrOnlyFact(ClrOnlyReason.Ilasm)] public void OverloadResolutionWithUnsupportedMetadata_UnsupportedMetadata_SupportedExists() { var il = @" .class public auto ansi beforefieldinit Methods extends [mscorlib]System.Object { .method public hidebysig static void M(int32 x) cil managed { ret } .method public hidebysig static void M(string modreq(int16) x) cil managed { ret } .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } } // end of class Methods .class public auto ansi beforefieldinit Indexers extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = {string('Item')} .method public hidebysig specialname instance int32 get_Item(int32 x) cil managed { ldc.i4.0 ret } .method public hidebysig specialname instance int32 get_Item(string modreq(int16) x) cil managed { ldc.i4.0 ret } .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } .property instance int32 Item(int32) { .get instance int32 Indexers::get_Item(int32) } .property instance int32 Item(string modreq(int16)) { .get instance int32 Indexers::get_Item(string modreq(int16)) } } // end of class Indexers .class public auto ansi beforefieldinit Constructors extends [mscorlib]System.Object { .method public hidebysig specialname rtspecialname instance void .ctor(int32 x) cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } .method public hidebysig specialname rtspecialname instance void .ctor(string modreq(int16) x) cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } } // end of class Constructors "; var source = @" using System; class C { static void Main() { var c1 = new Constructors(1); var c2 = new Constructors(null); Methods.M(1); Methods.M(null); Action<int> a1 = Methods.M; Action<string> a2 = Methods.M; var i1 = new Indexers()[1]; var i2 = new Indexers()[null]; } } "; CreateCompilationWithILAndMscorlib40(source, il).VerifyDiagnostics( // (9,35): error CS1503: Argument 1: cannot convert from '<null>' to 'int' // var c2 = new Constructors(null); Diagnostic(ErrorCode.ERR_BadArgType, "null").WithArguments("1", "<null>", "int"), // (12,19): error CS1503: Argument 1: cannot convert from '<null>' to 'int' // Methods.M(null); Diagnostic(ErrorCode.ERR_BadArgType, "null").WithArguments("1", "<null>", "int"), // (15,37): error CS0123: No overload for 'M' matches delegate 'System.Action<string>' // Action<string> a2 = Methods.M; Diagnostic(ErrorCode.ERR_MethDelegateMismatch, "M").WithArguments("M", "System.Action<string>"), // (18,33): error CS1503: Argument 1: cannot convert from '<null>' to 'int' // var i2 = new Indexers()[null]; Diagnostic(ErrorCode.ERR_BadArgType, "null").WithArguments("1", "<null>", "int")); } [WorkItem(708169, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/708169")] [ClrOnlyFact(ClrOnlyReason.Ilasm)] public void OverloadResolutionWithUnsupportedMetadata_UnsupportedMetadata_SupportedDoesNotExist() { var il = @" .class public auto ansi beforefieldinit Methods extends [mscorlib]System.Object { .method public hidebysig static void M(string modreq(int16) x) cil managed { ret } .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } } // end of class Methods .class public auto ansi beforefieldinit Indexers extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = {string('Item')} .method public hidebysig specialname instance int32 get_Item(string modreq(int16) x) cil managed { ldc.i4.0 ret } .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } .property instance int32 Item(string modreq(int16)) { .get instance int32 Indexers::get_Item(string modreq(int16)) } } // end of class Indexers .class public auto ansi beforefieldinit Constructors extends [mscorlib]System.Object { .method public hidebysig specialname rtspecialname instance void .ctor(string modreq(int16) x) cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } } // end of class Constructors "; var source = @" using System; class C { static void Main() { var c2 = new Constructors(null); Methods.M(null); Action<string> a2 = Methods.M; var i2 = new Indexers()[null]; } } "; CreateCompilationWithILAndMscorlib40(source, il).VerifyDiagnostics( // (8,22): error CS0570: 'Constructors.Constructors(string)' is not supported by the language // var c2 = new Constructors(null); Diagnostic(ErrorCode.ERR_BindToBogus, "Constructors").WithArguments("Constructors.Constructors(string)").WithLocation(8, 22), // (10,17): error CS0570: 'Methods.M(string)' is not supported by the language // Methods.M(null); Diagnostic(ErrorCode.ERR_BindToBogus, "M").WithArguments("Methods.M(string)").WithLocation(10, 17), // (12,29): error CS0570: 'Methods.M(string)' is not supported by the language // Action<string> a2 = Methods.M; Diagnostic(ErrorCode.ERR_BindToBogus, "Methods.M").WithArguments("Methods.M(string)").WithLocation(12, 29), // (14,18): error CS1546: Property, indexer, or event 'Indexers.this[string]' is not supported by the language; try directly calling accessor method 'Indexers.get_Item(string)' // var i2 = new Indexers()[null]; Diagnostic(ErrorCode.ERR_BindToBogusProp1, "new Indexers()[null]").WithArguments("Indexers.this[string]", "Indexers.get_Item(string)").WithLocation(14, 18)); } [WorkItem(939928, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/939928")] [WorkItem(132, "CodePlex")] [Fact] public void MissingBaseTypeForCatch() { var source1 = @" using System; public class GeneralException : Exception {}"; CSharpCompilation comp1 = CreateCompilation(source1, assemblyName: "Base"); var source2 = @" public class SpecificException : GeneralException {}"; CSharpCompilation comp2 = CreateCompilation(source2, new MetadataReference[] { new CSharpCompilationReference(comp1) }); var source3 = @" class Test { static void Main(string[] args) { try { SpecificException e = null; throw e; } catch (SpecificException) { } } }"; CSharpCompilation comp3 = CreateCompilation(source3, new MetadataReference[] { new CSharpCompilationReference(comp2) }); DiagnosticDescription[] expected = { // (9,23): error CS0012: The type 'GeneralException' is defined in an assembly that is not referenced. You must add a reference to assembly 'Base, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // throw e; Diagnostic(ErrorCode.ERR_NoTypeDef, "e").WithArguments("GeneralException", "Base, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(9, 23), // (9,23): error CS0029: Cannot implicitly convert type 'SpecificException' to 'System.Exception' // throw e; Diagnostic(ErrorCode.ERR_NoImplicitConv, "e").WithArguments("SpecificException", "System.Exception").WithLocation(9, 23), // (11,20): error CS0155: The type caught or thrown must be derived from System.Exception // catch (SpecificException) Diagnostic(ErrorCode.ERR_BadExceptionType, "SpecificException").WithLocation(11, 20), // (11,20): error CS0012: The type 'GeneralException' is defined in an assembly that is not referenced. You must add a reference to assembly 'Base, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // catch (SpecificException) Diagnostic(ErrorCode.ERR_NoTypeDef, "SpecificException").WithArguments("GeneralException", "Base, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(11, 20) }; comp3.VerifyDiagnostics(expected); comp3 = CreateCompilation(source3, new MetadataReference[] { comp2.EmitToImageReference() }); comp3.VerifyDiagnostics(expected); } /// <summary> /// Trivial definitions of special types that will be required for testing use site errors in /// the attributes emitted for unsafe assemblies. /// </summary> private const string unsafeAttributeSystemTypes = @" namespace System { public class Object { } public class ValueType { } public class Enum { } // Diagnostic if this extends ValueType public struct Boolean { } public struct Void { } public class Attribute { } } "; /// <summary> /// Compile without corlib, and then verify semantic diagnostics, emit-metadata diagnostics, and emit diagnostics. /// </summary> private static void CompileUnsafeAttributesAndCheckDiagnostics(string corLibText, bool moduleOnly, params DiagnosticDescription[] expectedDiagnostics) { CSharpCompilationOptions options = TestOptions.UnsafeReleaseDll; if (moduleOnly) { options = options.WithOutputKind(OutputKind.NetModule); } var compilation = CreateEmptyCompilation( new[] { Parse(corLibText) }, options: options); compilation.VerifyDiagnostics(expectedDiagnostics); } #endregion Attributes for unsafe code /// <summary> /// First, compile the provided source with all assemblies and confirm that there are no errors. /// Then, compile the provided source again without the unavailable assembly and return the result. /// </summary> private static CSharpCompilation CompileWithMissingReference(string source) { var unavailableAssemblyReference = TestReferences.SymbolsTests.UseSiteErrors.Unavailable; var csharpAssemblyReference = TestReferences.SymbolsTests.UseSiteErrors.CSharp; var ilAssemblyReference = TestReferences.SymbolsTests.UseSiteErrors.IL; var successfulCompilation = CreateCompilation(source, new MetadataReference[] { unavailableAssemblyReference, csharpAssemblyReference, ilAssemblyReference }); successfulCompilation.VerifyDiagnostics(); // No diagnostics when reference is present var failingCompilation = CreateCompilation(source, new MetadataReference[] { csharpAssemblyReference, ilAssemblyReference }); return failingCompilation; } [Fact] [WorkItem(14267, "https://github.com/dotnet/roslyn/issues/14267")] public void MissingTypeKindBasisTypes() { var source1 = @" public struct A {} public enum B {} public class C {} public delegate void D(); public interface I1 {} "; var parseOptions = TestOptions.Regular.WithNoRefSafetyRulesAttribute(); var compilation1 = CreateEmptyCompilation(source1, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { MinCorlibRef }); compilation1.VerifyEmitDiagnostics(); Assert.Equal(TypeKind.Struct, compilation1.GetTypeByMetadataName("A").TypeKind); Assert.Equal(TypeKind.Enum, compilation1.GetTypeByMetadataName("B").TypeKind); Assert.Equal(TypeKind.Class, compilation1.GetTypeByMetadataName("C").TypeKind); Assert.Equal(TypeKind.Delegate, compilation1.GetTypeByMetadataName("D").TypeKind); Assert.Equal(TypeKind.Interface, compilation1.GetTypeByMetadataName("I1").TypeKind); var source2 = @" interface I2 { I1 M(A a, B b, C c, D d); } "; var compilation2 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.EmitToImageReference(), MinCorlibRef }); compilation2.VerifyEmitDiagnostics(); CompileAndVerify(compilation2); Assert.Equal(TypeKind.Struct, compilation2.GetTypeByMetadataName("A").TypeKind); Assert.Equal(TypeKind.Enum, compilation2.GetTypeByMetadataName("B").TypeKind); Assert.Equal(TypeKind.Class, compilation2.GetTypeByMetadataName("C").TypeKind); Assert.Equal(TypeKind.Delegate, compilation2.GetTypeByMetadataName("D").TypeKind); Assert.Equal(TypeKind.Interface, compilation2.GetTypeByMetadataName("I1").TypeKind); var compilation3 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.ToMetadataReference(), MinCorlibRef }); compilation3.VerifyEmitDiagnostics(); CompileAndVerify(compilation3); Assert.Equal(TypeKind.Struct, compilation3.GetTypeByMetadataName("A").TypeKind); Assert.Equal(TypeKind.Enum, compilation3.GetTypeByMetadataName("B").TypeKind); Assert.Equal(TypeKind.Class, compilation3.GetTypeByMetadataName("C").TypeKind); Assert.Equal(TypeKind.Delegate, compilation3.GetTypeByMetadataName("D").TypeKind); Assert.Equal(TypeKind.Interface, compilation3.GetTypeByMetadataName("I1").TypeKind); var compilation4 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.EmitToImageReference() }); compilation4.VerifyDiagnostics( // (4,10): error CS0012: The type 'ValueType' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "A").WithArguments("System.ValueType", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 10), // (4,15): error CS0012: The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "B").WithArguments("System.Enum", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 15), // (4,25): error CS0012: The type 'MulticastDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "D").WithArguments("System.MulticastDelegate", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 25) ); var a = compilation4.GetTypeByMetadataName("A"); var b = compilation4.GetTypeByMetadataName("B"); var c = compilation4.GetTypeByMetadataName("C"); var d = compilation4.GetTypeByMetadataName("D"); var i1 = compilation4.GetTypeByMetadataName("I1"); Assert.Equal(TypeKind.Class, a.TypeKind); Assert.NotNull(a.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, b.TypeKind); Assert.NotNull(b.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, c.TypeKind); Assert.Null(c.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, d.TypeKind); Assert.NotNull(d.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Interface, i1.TypeKind); Assert.Null(i1.GetUseSiteDiagnostic()); var compilation5 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.ToMetadataReference() }); compilation5.VerifyEmitDiagnostics( // warning CS8021: No value for RuntimeMetadataVersion found. No assembly containing System.Object was found nor was a value for RuntimeMetadataVersion specified through options. Diagnostic(ErrorCode.WRN_NoRuntimeMetadataVersion).WithLocation(1, 1) ); // ILVerify: no corlib CompileAndVerify(compilation5, verify: Verification.FailsILVerify); Assert.Equal(TypeKind.Struct, compilation5.GetTypeByMetadataName("A").TypeKind); Assert.Equal(TypeKind.Enum, compilation5.GetTypeByMetadataName("B").TypeKind); Assert.Equal(TypeKind.Class, compilation5.GetTypeByMetadataName("C").TypeKind); Assert.Equal(TypeKind.Delegate, compilation5.GetTypeByMetadataName("D").TypeKind); Assert.Equal(TypeKind.Interface, compilation5.GetTypeByMetadataName("I1").TypeKind); var compilation6 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.EmitToImageReference(), MscorlibRef }); compilation6.VerifyDiagnostics( // (4,10): error CS0012: The type 'ValueType' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "A").WithArguments("System.ValueType", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 10), // (4,15): error CS0012: The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "B").WithArguments("System.Enum", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 15), // (4,25): error CS0012: The type 'MulticastDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2'. // I1 M(A a, B b, C c, D d); Diagnostic(ErrorCode.ERR_NoTypeDef, "D").WithArguments("System.MulticastDelegate", "mincorlib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2").WithLocation(4, 25) ); a = compilation6.GetTypeByMetadataName("A"); b = compilation6.GetTypeByMetadataName("B"); c = compilation6.GetTypeByMetadataName("C"); d = compilation6.GetTypeByMetadataName("D"); i1 = compilation6.GetTypeByMetadataName("I1"); Assert.Equal(TypeKind.Class, a.TypeKind); Assert.NotNull(a.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, b.TypeKind); Assert.NotNull(b.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, c.TypeKind); Assert.Null(c.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Class, d.TypeKind); Assert.NotNull(d.GetUseSiteDiagnostic()); Assert.Equal(TypeKind.Interface, i1.TypeKind); Assert.Null(i1.GetUseSiteDiagnostic()); var compilation7 = CreateEmptyCompilation(source2, parseOptions: parseOptions, options: TestOptions.ReleaseDll, references: new[] { compilation1.ToMetadataReference(), MscorlibRef }); compilation7.VerifyEmitDiagnostics(); CompileAndVerify(compilation7); Assert.Equal(TypeKind.Struct, compilation7.GetTypeByMetadataName("A").TypeKind); Assert.Equal(TypeKind.Enum, compilation7.GetTypeByMetadataName("B").TypeKind); Assert.Equal(TypeKind.Class, compilation7.GetTypeByMetadataName("C").TypeKind); Assert.Equal(TypeKind.Delegate, compilation7.GetTypeByMetadataName("D").TypeKind); Assert.Equal(TypeKind.Interface, compilation7.GetTypeByMetadataName("I1").TypeKind); } [Fact, WorkItem(15435, "https://github.com/dotnet/roslyn/issues/15435")] public void TestGettingAssemblyIdsFromDiagnostic1() { var text = @" class C : CSharpErrors.ClassMethods { public override UnavailableClass ReturnType1() { return null; } public override UnavailableClass[] ReturnType2() { return null; } }"; var compilation = CompileWithMissingReference(text); var diagnostics = compilation.GetDiagnostics(); Assert.True(diagnostics.Any(d => d.Code == (int)ErrorCode.ERR_NoTypeDef)); foreach (var diagnostic in diagnostics) { if (diagnostic.Code == (int)ErrorCode.ERR_NoTypeDef) { var actualAssemblyId = compilation.GetUnreferencedAssemblyIdentities(diagnostic).Single(); AssemblyIdentity expectedAssemblyId; AssemblyIdentity.TryParseDisplayName("Unavailable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", out expectedAssemblyId); Assert.Equal(actualAssemblyId, expectedAssemblyId); } } } private static readonly MetadataReference UnmanagedUseSiteError_Ref1 = CreateCompilation(@" public struct S1 { public int i; }", assemblyName: "libS1").ToMetadataReference(); private static readonly MetadataReference UnmanagedUseSiteError_Ref2 = CreateCompilation(@" public struct S2 { public S1 s1; } ", references: new[] { UnmanagedUseSiteError_Ref1 }, assemblyName: "libS2").ToMetadataReference(); [Fact] public void Unmanaged_UseSiteError_01() { var source = @" class C { unsafe void M(S2 s2) { var ptr = &s2; } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (6,19): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var ptr = &s2; Diagnostic(ErrorCode.ERR_NoTypeDef, "&s2").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 19), // (6,19): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // var ptr = &s2; Diagnostic(ErrorCode.WRN_ManagedAddr, "&s2").WithArguments("S2").WithLocation(6, 19) ); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_02() { var source = @" class C { unsafe void M() { var size = sizeof(S2); } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (6,20): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // var size = sizeof(S2); Diagnostic(ErrorCode.ERR_NoTypeDef, "sizeof(S2)").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 20), // (6,20): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // var size = sizeof(S2); Diagnostic(ErrorCode.WRN_ManagedAddr, "sizeof(S2)").WithArguments("S2").WithLocation(6, 20)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_03() { var source = @" class C { unsafe void M(S2* ptr) { } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (4,23): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // unsafe void M(S2* ptr) Diagnostic(ErrorCode.ERR_NoTypeDef, "ptr").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(4, 23), // (4,23): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // unsafe void M(S2* ptr) Diagnostic(ErrorCode.WRN_ManagedAddr, "ptr").WithArguments("S2").WithLocation(4, 23)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_04() { var source = @" class C { unsafe void M() { S2* span = stackalloc S2[16]; S2* span2 = stackalloc [] { default(S2) }; } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (6,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // S2* span = stackalloc S2[16]; Diagnostic(ErrorCode.ERR_NoTypeDef, "S2*").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 9), // (6,9): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // S2* span = stackalloc S2[16]; Diagnostic(ErrorCode.WRN_ManagedAddr, "S2*").WithArguments("S2").WithLocation(6, 9), // (6,31): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // S2* span = stackalloc S2[16]; Diagnostic(ErrorCode.ERR_NoTypeDef, "S2").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(6, 31), // (6,31): error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('S2') // S2* span = stackalloc S2[16]; Diagnostic(ErrorCode.ERR_ManagedAddr, "S2").WithArguments("S2").WithLocation(6, 31), // (7,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // S2* span2 = stackalloc [] { default(S2) }; Diagnostic(ErrorCode.ERR_NoTypeDef, "S2*").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 9), // (7,9): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // S2* span2 = stackalloc [] { default(S2) }; Diagnostic(ErrorCode.WRN_ManagedAddr, "S2*").WithArguments("S2").WithLocation(7, 9), // (7,21): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // S2* span2 = stackalloc [] { default(S2) }; Diagnostic(ErrorCode.ERR_NoTypeDef, "stackalloc [] { default(S2) }").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 21), // (7,21): error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('S2') // S2* span2 = stackalloc [] { default(S2) }; Diagnostic(ErrorCode.ERR_ManagedAddr, "stackalloc [] { default(S2) }").WithArguments("S2").WithLocation(7, 21)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_05() { var source = @" class C { S2 s2; unsafe void M() { fixed (S2* ptr = &s2) { } } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (7,16): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.ERR_NoTypeDef, "S2*").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 16), // (7,16): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.WRN_ManagedAddr, "S2*").WithArguments("S2").WithLocation(7, 16), // (7,26): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.ERR_NoTypeDef, "&s2").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 26), // (7,26): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.WRN_ManagedAddr, "&s2").WithArguments("S2").WithLocation(7, 26), // (7,26): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.ERR_NoTypeDef, "&s2").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(7, 26), // (7,26): warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type ('S2') // fixed (S2* ptr = &s2) Diagnostic(ErrorCode.WRN_ManagedAddr, "&s2").WithArguments("S2").WithLocation(7, 26) ); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_06() { var source = @" class C { void M<T>(T t) where T : unmanaged { } void M1() { M(default(S2)); // 1, 2 M(default(S2)); // 3, 4 } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (8,9): error CS8377: The type 'S2' must be a non-nullable value type, along with all fields at any level of nesting, in order to use it as parameter 'T' in the generic type or method 'C.M<T>(T)' // M(default(S2)); // 1, 2 Diagnostic(ErrorCode.ERR_UnmanagedConstraintNotSatisfied, "M").WithArguments("C.M<T>(T)", "T", "S2").WithLocation(8, 9), // (8,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // M(default(S2)); // 1, 2 Diagnostic(ErrorCode.ERR_NoTypeDef, "M").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(8, 9), // (9,9): error CS8377: The type 'S2' must be a non-nullable value type, along with all fields at any level of nesting, in order to use it as parameter 'T' in the generic type or method 'C.M<T>(T)' // M(default(S2)); // 3, 4 Diagnostic(ErrorCode.ERR_UnmanagedConstraintNotSatisfied, "M").WithArguments("C.M<T>(T)", "T", "S2").WithLocation(9, 9), // (9,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // M(default(S2)); // 3, 4 Diagnostic(ErrorCode.ERR_NoTypeDef, "M").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(9, 9)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_07() { var source = @" public struct S3 { public S2 s2; } class C { void M<T>(T t) where T : unmanaged { } void M1() { M(default(S3)); // 1, 2 M(default(S3)); // 3, 4 } } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // (13,9): error CS8377: The type 'S3' must be a non-nullable value type, along with all fields at any level of nesting, in order to use it as parameter 'T' in the generic type or method 'C.M<T>(T)' // M(default(S3)); // 1, 2 Diagnostic(ErrorCode.ERR_UnmanagedConstraintNotSatisfied, "M").WithArguments("C.M<T>(T)", "T", "S3").WithLocation(13, 9), // (13,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // M(default(S3)); // 1, 2 Diagnostic(ErrorCode.ERR_NoTypeDef, "M").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(13, 9), // (14,9): error CS8377: The type 'S3' must be a non-nullable value type, along with all fields at any level of nesting, in order to use it as parameter 'T' in the generic type or method 'C.M<T>(T)' // M(default(S3)); // 3, 4 Diagnostic(ErrorCode.ERR_UnmanagedConstraintNotSatisfied, "M").WithArguments("C.M<T>(T)", "T", "S3").WithLocation(14, 9), // (14,9): error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. // M(default(S3)); // 3, 4 Diagnostic(ErrorCode.ERR_NoTypeDef, "M").WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(14, 9)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_08() { var source = @" using System.Threading.Tasks; using System; class C { async Task M1() { S2 s2 = M2(); await M1(); Console.Write(s2); } S2 M2() => default; } "; var comp = CreateCompilation(source, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics( // error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Diagnostic(ErrorCode.ERR_NoTypeDef).WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(1, 1), // error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Diagnostic(ErrorCode.ERR_NoTypeDef).WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(1, 1), // error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Diagnostic(ErrorCode.ERR_NoTypeDef).WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(1, 1)); comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); } [Fact] public void Unmanaged_UseSiteError_09() { var source = @" public struct S3 { public S2 s2; } "; var comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); var s3 = comp.GetMember<NamedTypeSymbol>("S3"); verifyIsManagedType(); verifyIsManagedType(); void verifyIsManagedType() { var managedKindUseSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(s3.ContainingAssembly); Assert.True(s3.IsManagedType(ref managedKindUseSiteInfo)); managedKindUseSiteInfo.Diagnostics.Verify( // error CS0012: The type 'S1' is defined in an assembly that is not referenced. You must add a reference to assembly 'libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Diagnostic(ErrorCode.ERR_NoTypeDef).WithArguments("S1", "libS1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").WithLocation(1, 1) ); } comp = CreateCompilation(source, options: TestOptions.UnsafeDebugDll, references: new[] { UnmanagedUseSiteError_Ref1, UnmanagedUseSiteError_Ref2 }); comp.VerifyEmitDiagnostics(); s3 = comp.GetMember<NamedTypeSymbol>("S3"); verifyIsUnmanagedType(); verifyIsUnmanagedType(); void verifyIsUnmanagedType() { var managedKindUseSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(s3.ContainingAssembly); Assert.False(s3.IsManagedType(ref managedKindUseSiteInfo)); Assert.Null(managedKindUseSiteInfo.Diagnostics); } } [Fact] public void OverrideWithModreq_01() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } } // end of class CL1 "; var source = @" class Test : CL1 { public override int get_P() { return default; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (4,25): error CS0570: 'CL1.get_P()' is not supported by the language // public override int get_P() Diagnostic(ErrorCode.ERR_BindToBogus, "get_P").WithArguments("CL1.get_P()").WithLocation(4, 25) ); } [Fact] public void OverrideWithModreq_02() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } .property instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { get => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (4,25): error CS0569: 'Test.P': cannot override 'CL1.P' because it is not supported by the language // public override int P Diagnostic(ErrorCode.ERR_CantOverrideBogusMethod, "P").WithArguments("Test.P", "CL1.P").WithLocation(4, 25) ); } [Fact] public void OverrideWithModreq_03() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { get => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9) ); } [Fact] public void OverrideWithModreq_04() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { .maxstack 8 ret } .property instance int32 P() { .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(6, 9) ); } [Fact] public void OverrideWithModreq_05() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { .maxstack 8 ret } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9), // (7,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(7, 9) ); } [Fact] public void OverrideWithModreq_06() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { .maxstack 8 ret } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (7,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(7, 9) ); } [Fact] public void OverrideWithModreq_07() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { .maxstack 8 ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P(int32 x) cil managed { .maxstack 8 ret } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() .set instance void CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test : CL1 { public override int P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9) ); } [Fact] public void OverrideWithModreq_08() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig specialname newslot virtual instance void add_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { ret } .method public hidebysig specialname newslot virtual instance void remove_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { ret } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) .removeon instance void CL1::remove_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) } } // end of class CL1 "; var source = @" class Test : CL1 { public override event System.Action E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(6, 9), // (7,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(7, 9) ); } [Fact] public void OverrideWithModreq_09() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig specialname newslot virtual instance void add_E ( class [mscorlib]System.Action 'value' ) cil managed { ret } .method public hidebysig specialname newslot virtual instance void remove_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { ret } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action) .removeon instance void CL1::remove_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) } } // end of class CL1 "; var source = @" class Test : CL1 { public override event System.Action E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (7,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(7, 9) ); } [Fact] public void OverrideWithModreq_10() { var il = @" .class public auto ansi beforefieldinit CL1 extends[mscorlib] System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void[mscorlib] System.Object::.ctor() IL_0006: ret } .method public hidebysig specialname newslot virtual instance void add_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { ret } .method public hidebysig specialname newslot virtual instance void remove_E ( class [mscorlib]System.Action 'value' ) cil managed { ret } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) .removeon instance void CL1::remove_E(class [mscorlib]System.Action) } } // end of class CL1 "; var source = @" class Test : CL1 { public override event System.Action E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(6, 9) ); } [Fact] public void ImplementWithModreq_01() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { } } // end of class CL1 "; var source = @" class Test : CL1 { public int get_P() { return default; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (4,16): error CS0570: 'CL1.get_P()' is not supported by the language // public int get_P() Diagnostic(ErrorCode.ERR_BindToBogus, "get_P").WithArguments("CL1.get_P()").WithLocation(4, 16) ); } [Fact] public void ImplementWithModreq_02() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { } .property instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { get => throw null; } } class Test2 : CL1 { int CL1.P { get => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0686: Accessor 'Test1.P.get' cannot implement interface member 'CL1.get_P()' for type 'Test1'. Use an explicit interface implementation. // get => throw null; Diagnostic(ErrorCode.ERR_AccessorImplementingMethod, "get").WithArguments("Test1.P.get", "CL1.get_P()", "Test1").WithLocation(6, 9), // (12,13): error CS0682: 'Test2.CL1.P' cannot implement 'CL1.P' because it is not supported by the language // int CL1.P Diagnostic(ErrorCode.ERR_BogusExplicitImpl, "P").WithArguments("Test2.CL1.P", "CL1.P").WithLocation(12, 13), // (14,9): error CS0570: 'CL1.get_P()' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.get_P()").WithLocation(14, 9) ); } [Fact] public void ImplementWithModreq_03() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { get => throw null; } } class Test2 : CL1 { int CL1.P { get => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9), // (14,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(14, 9) ); } [Fact] public void ImplementWithModreq_04() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { } .property instance int32 P() { .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { set => throw null; } } class Test2 : CL1 { int CL1.P { set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(6, 9), // (14,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(14, 9) ); } [Fact] public void ImplementWithModreq_05() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { get => throw null; set => throw null; } } class Test2 : CL1 { int CL1.P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9), // (7,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(7, 9), // (15,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(15, 9), // (16,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(16, 9) ); } [Fact] public void ImplementWithModreq_06() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) set_P(int32 x) cil managed { } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { get => throw null; set => throw null; } } class Test2 : CL1 { int CL1.P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (7,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(7, 9), // (16,9): error CS0570: 'CL1.P.set' is not supported by the language // set => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "set").WithArguments("CL1.P.set").WithLocation(16, 9) ); } [Fact] public void ImplementWithModreq_07() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void set_P(int32 x) cil managed { } .property instance int32 P() { .get instance int32 modreq([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_P() .set instance void CL1::set_P(int32) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public int P { get => throw null; set => throw null; } } class Test2 : CL1 { int CL1.P { get => throw null; set => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(6, 9), // (15,9): error CS0570: 'CL1.P.get' is not supported by the language // get => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "get").WithArguments("CL1.P.get").WithLocation(15, 9) ); } [Fact] public void ImplementWithModreq_08() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig specialname newslot abstract virtual instance void add_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { } .method public hidebysig specialname newslot abstract virtual instance void remove_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) .removeon instance void CL1::remove_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public event System.Action E { add => throw null; remove => throw null; } } class Test2 : CL1 { event System.Action CL1.E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(6, 9), // (7,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(7, 9), // (15,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(15, 9), // (16,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(16, 9) ); } [Fact] public void ImplementWithModreq_09() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig specialname newslot abstract virtual instance void add_E ( class [mscorlib]System.Action 'value' ) cil managed { } .method public hidebysig specialname newslot abstract virtual instance void remove_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action) .removeon instance void CL1::remove_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public event System.Action E { add => throw null; remove => throw null; } } class Test2 : CL1 { event System.Action CL1.E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (7,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(7, 9), // (16,9): error CS0570: 'CL1.E.remove' is not supported by the language // remove => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "remove").WithArguments("CL1.E.remove").WithLocation(16, 9) ); } [Fact] public void ImplementWithModreq_10() { var il = @" .class interface public abstract auto ansi CL1 { .method public hidebysig specialname newslot abstract virtual instance void add_E ( class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst) 'value' ) cil managed { } .method public hidebysig specialname newslot abstract virtual instance void remove_E ( class [mscorlib]System.Action 'value' ) cil managed { } .event [mscorlib]System.Action E { .addon instance void CL1::add_E(class [mscorlib]System.Action modreq([mscorlib]System.Runtime.CompilerServices.IsConst)) .removeon instance void CL1::remove_E(class [mscorlib]System.Action) } } // end of class CL1 "; var source = @" class Test1 : CL1 { public event System.Action E { add => throw null; remove => throw null; } } class Test2 : CL1 { event System.Action CL1.E { add => throw null; remove => throw null; } } "; CreateCompilationWithIL(source, il).VerifyDiagnostics( // (6,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(6, 9), // (15,9): error CS0570: 'CL1.E.add' is not supported by the language // add => throw null; Diagnostic(ErrorCode.ERR_BindToBogus, "add").WithArguments("CL1.E.add").WithLocation(15, 9) ); } } }