diff --git a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs index ad4ccc32a129de7d3122e5f850686b19ea27a355..38c4abc96806d73df060752debf7032d0fc2e68e 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs +++ b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs @@ -5578,6 +5578,15 @@ internal class CSharpResources { } } + /// + /// Looks up a localized string similar to Variadic member '{0}' cannot implement interface member '{1}' in type '{2}'. Use an explicit interface implementation.. + /// + internal static string ERR_InterfaceImplementedImplicitlyByVariadic { + get { + return ResourceManager.GetString("ERR_InterfaceImplementedImplicitlyByVariadic", resourceCulture); + } + } + /// /// Looks up a localized string similar to '{0}': interface members cannot have a definition. /// diff --git a/src/Compilers/CSharp/Portable/CSharpResources.resx b/src/Compilers/CSharp/Portable/CSharpResources.resx index 610aafe8f742657881f72a02b213ace99162cae1..1e7ad99c6fc368d3a49ac2627fdaf73e364745cd 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.resx +++ b/src/Compilers/CSharp/Portable/CSharpResources.resx @@ -1755,6 +1755,9 @@ If such a class is used as a base class and if the deriving class defines a dest Conditional member '{0}' cannot implement interface member '{1}' in type '{2}' + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + ref and out are not valid in this context diff --git a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs index 358b6c6d05ff897c95dd3c99d8c2b1a7d0bee723..5c88b9f6dd496393301810784746c6242d72f266 100644 --- a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs +++ b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs @@ -427,6 +427,7 @@ internal enum ErrorCode WRN_ExternMethodNoImplementation = 626, WRN_ProtectedInSealed = 628, ERR_InterfaceImplementedByConditional = 629, + ERR_InterfaceImplementedImplicitlyByVariadic = 630, ERR_IllegalRefParam = 631, ERR_BadArgumentToAttribute = 633, //ERR_MissingComTypeOrMarshaller = 635, diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol_ImplementationChecks.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol_ImplementationChecks.cs index 17eb7de3c54175dcc4f596aeb727962ae5cb88f1..759eac16576b48fa82e2aa8d9e1e1c104165b6b7 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol_ImplementationChecks.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol_ImplementationChecks.cs @@ -141,7 +141,16 @@ private void CheckAbstractClassImplementations(DiagnosticBag diagnostics) if ((object)synthesizedImplementation != null) { - synthesizedImplementations.Add(synthesizedImplementation); + if (synthesizedImplementation.IsVararg) + { + diagnostics.Add( + ErrorCode.ERR_InterfaceImplementedImplicitlyByVariadic, + GetImplicitImplementationDiagnosticLocation(interfaceMember, this, implementingMember), implementingMember, interfaceMember, this); + } + else + { + synthesizedImplementations.Add(synthesizedImplementation); + } } if (wasImplementingMemberFound && interfaceMemberKind == SymbolKind.Event) diff --git a/src/Compilers/CSharp/Portable/Symbols/TypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/TypeSymbol.cs index be19e421cc4f86a794d198c5b34bf644cf86759c..e8a5121f6f5bd37417004e6681a3309c7d56a50e 100644 --- a/src/Compilers/CSharp/Portable/Symbols/TypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/TypeSymbol.cs @@ -1213,7 +1213,7 @@ private static void ReportAnyMismatchedConstraints(MethodSymbol interfaceMethod, } } - private static Location GetImplicitImplementationDiagnosticLocation(Symbol interfaceMember, TypeSymbol implementingType, Symbol member) + internal static Location GetImplicitImplementationDiagnosticLocation(Symbol interfaceMember, TypeSymbol implementingType, Symbol member) { if (member.ContainingType == implementingType) { diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf index 8578247af0144824791aacbc2d997d3424cb9bfa..10ef433e0e3f8fe16f3b520fa12c904a2d402a95 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf @@ -8595,6 +8595,11 @@ Pokud chcete odstranit toto varování, můžete místo toho použít /reference ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf index 1fa9abf5a395f51b283aa58a5eff1bc60647697c..0125b587aba56ae899231d0cbaf74396b305c31c 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf @@ -8595,6 +8595,11 @@ Um die Warnung zu beheben, können Sie stattdessen /reference verwenden (Einbett ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf index 5acc1a37bffe6d1e9bf67e0499f4e8b382be6a55..c1718fb52619357643c68e81b05a56dec78bd9ed 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf @@ -8595,6 +8595,11 @@ Para eliminar la advertencia puede usar /reference (establezca la propiedad Embe ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf index ff15e09fe5de656e9eeb0b4049797d4412f3261f..c3efdd3b3475e64c66e71ff58b476d1d7de8f2b4 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf @@ -8595,6 +8595,11 @@ Pour supprimer l'avertissement, vous pouvez utiliser la commande /reference (dé ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf index 19091f8fdcdf5d0209989e4a0726dc2af3aeb693..e5506269083657ca822e15f5708ac2918604277c 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf @@ -8595,6 +8595,11 @@ Per rimuovere l'avviso, è invece possibile usare /reference (impostare la propr ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf index ada6d3662cfbc2e8a9bd3bb0f9330a5b98172b4b..1b9fb0f98b961d80096db40a20832b71601e8664 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf @@ -8595,6 +8595,11 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf index 3412f707871b632a3ea498e29887e48acff192de..3f32b2f5665e0ce4657fbd3c7d651fecf9febc71 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf @@ -8595,6 +8595,11 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf index 3d63549c25994156fee81a6c87b56e9951849dfe..f78b5c091ba79e03743ad84d17fb10deccfaa454 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf @@ -8595,6 +8595,11 @@ Aby usunąć ostrzeżenie, możesz zamiast tego użyć opcji /reference (ustaw w ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf index 6309f1f8b5ac11befe01560b587f507d7885d487..956bedc39b46c099e74e269d0303cfe978d731d1 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf @@ -8595,6 +8595,11 @@ Para incorporar informações de tipo de interoperabilidade para os dois assembl ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf index 4c034bf19f40bd5888b1ca67a654bc5f127680ba..fe119b87a20a5953905fa58d3729312679536a10 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf @@ -8595,6 +8595,11 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf index 8b52959fe02d6087142814f43e361f1770817d7c..ae0c82545925854bca5dc4b3db58eb97d09afdbb 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf @@ -8595,6 +8595,11 @@ Uyarıyı kaldırmak için, /reference kullanabilirsiniz (Birlikte Çalışma T ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf index af75a35d15efcd728c935baea3cf8a6384610fa0..f26b9edeeb200e1b20ce48e248a4689e2dffd2e8 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf @@ -8595,6 +8595,11 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf index 200b9635fb7c1397f4e7672c8111e99579714aba..e4ce7a6bd663395499c18e9df8c2d9c4b8c9deea 100644 --- a/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf +++ b/src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf @@ -8595,6 +8595,11 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ ref conditional expression + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter. Use an explicit interface implementation. + + \ No newline at end of file diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs index aee9ee75f6608696819304d5592ddef50bc02693..ebfb17b797dcd67ce5d37faccf0fee31285b21e4 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs @@ -13292,6 +13292,96 @@ .maxstack 4 "); } + [WorkItem(24348, "https://github.com/dotnet/roslyn/issues/24348")] + [Fact] + public void VarargBridgeSource() + { + + var code = @" +public class VarArgs +{ + public void Invoke(__arglist) + { + var ai = new System.ArgIterator(__arglist); + System.Console.WriteLine(ai.GetRemainingCount()); + } +} + +interface IVarArgs +{ + void Invoke(__arglist); +} + +class MyVarArgs : VarArgs, IVarArgs +{ + +} + +public static class P +{ + public static void Main() + { + IVarArgs iv = new MyVarArgs(); + + iv.Invoke(__arglist(1, 2, 3, 4)); + } +} +"; + + var compilation = CompileAndVerify(code, expectedOutput: "4"); + } + + [WorkItem(24348, "https://github.com/dotnet/roslyn/issues/24348")] + [Fact] + public void VarargBridgeMeta() + { + var reference = CreateStandardCompilation(@" +public class VarArgs +{ + public void Invoke(__arglist) + { + var ai = new System.ArgIterator(__arglist); + System.Console.WriteLine(ai.GetRemainingCount()); + } +}"); + + var code = @" +interface IVarArgs +{ + void Invoke(__arglist); +} + +class MyVarArgs : VarArgs, IVarArgs +{ + +} + +public static class P +{ + public static void Main() + { + IVarArgs iv = new MyVarArgs(); + + iv.Invoke(__arglist(1, 2, 3, 4)); + } +} +"; + + var comp = CreateStandardCompilation(code, references: new[] { reference.ToMetadataReference() }); + comp.VerifyDiagnostics( + // (7,28): error CS0630: 'VarArgs.Invoke(__arglist)' cannot implement interface member 'IVarArgs.Invoke(__arglist)' in type 'MyVarArgs' because it has an __arglist parameter. Use an explicit interface implementation. + // class MyVarArgs : VarArgs, IVarArgs + Diagnostic(ErrorCode.ERR_InterfaceImplementedImplicitlyByVariadic, "IVarArgs").WithArguments("VarArgs.Invoke(__arglist)", "IVarArgs.Invoke(__arglist)", "MyVarArgs").WithLocation(7, 28) + ); + + comp = CreateStandardCompilation(code, references: new[] { reference.EmitToImageReference() }); + comp.VerifyDiagnostics( + // (7,28): error CS0630: 'VarArgs.Invoke(__arglist)' cannot implement interface member 'IVarArgs.Invoke(__arglist)' in type 'MyVarArgs' because it has an __arglist parameter. Use an explicit interface implementation. + // class MyVarArgs : VarArgs, IVarArgs + Diagnostic(ErrorCode.ERR_InterfaceImplementedImplicitlyByVariadic, "IVarArgs").WithArguments("VarArgs.Invoke(__arglist)", "IVarArgs.Invoke(__arglist)", "MyVarArgs").WithLocation(7, 28) + ); + } + [WorkItem(530067, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530067")] [Fact] public void NopAfterCall()