diff --git a/src/coreclr/tools/ILVerification/TypeVerifier.cs b/src/coreclr/tools/ILVerification/TypeVerifier.cs index 9c760c8dd733fb..94672533bdd21f 100644 --- a/src/coreclr/tools/ILVerification/TypeVerifier.cs +++ b/src/coreclr/tools/ILVerification/TypeVerifier.cs @@ -99,7 +99,11 @@ public void VerifyInterfaces() continue; } - MethodDesc resolvedMethod = type.ResolveInterfaceMethodTarget(method); + if (type.ResolveInterfaceMethodTarget(method) is not MethodDesc resolvedMethod) + { + type.ResolveInterfaceMethodToDefaultImplementationOnType(method, out resolvedMethod); + } + if (resolvedMethod is null) { VerificationError(VerifierError.InterfaceMethodNotImplemented, Format(type), Format(implementedInterface.InterfaceType, _module, implementedInterface.InterfaceImplementation), Format(method)); diff --git a/src/tests/ilverify/ILTests/DefaultInterfaceMethod.il b/src/tests/ilverify/ILTests/DefaultInterfaceMethod.il new file mode 100644 index 00000000000000..a33f5cdddbe7c2 --- /dev/null +++ b/src/tests/ilverify/ILTests/DefaultInterfaceMethod.il @@ -0,0 +1,124 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +.assembly DefaultInterfaceMethod +{ +} + +.assembly extern System.Runtime +{ +} + +.class interface private auto ansi abstract IInterface +{ + .method public hidebysig newslot abstract virtual + instance void Method () cil managed + { + } +} + +.class public auto ansi beforefieldinit ChildClassDoesNotImplementDefaultInterfaceMethod_ValidType_Valid + extends [System.Runtime]System.Object + implements IDefaultImplInterface +{ + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [System.Runtime]System.Object::.ctor() + IL_0006: nop + IL_0007: ret + } +} + +.class public auto ansi beforefieldinit ChildClassDoesImplementDefaultInterfaceMethod_ValidType_Valid + extends [System.Runtime]System.Object + implements IDefaultImplInterface +{ + .method public final hidebysig newslot virtual + instance void DefaultImplementation () cil managed + { + .maxstack 8 + + IL_0000: ret + } + + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [System.Runtime]System.Object::.ctor() + IL_0006: nop + IL_0007: ret + } +} + +.class interface public auto ansi abstract IDefaultImplInterface +{ + .method public hidebysig newslot virtual + instance void DefaultImplementation () cil managed + { + .maxstack 8 + + IL_0000: ret + } +} + +.class interface public auto ansi abstract IInheritedDefaultImplInterface + implements IInterface +{ + .method private final hidebysig virtual + instance void IInterface.Method () cil managed + { + .override method instance void IInterface::Method() + .maxstack 8 + + IL_0001: ret + } +} + +.class public auto ansi beforefieldinit ClassInheritsFromInterfaceWhereContractIsImplementedByDerivedInterface_ValidType_Valid + extends [System.Runtime]System.Object + implements IInheritedDefaultImplInterface, IInterface +{ + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [System.Runtime]System.Object::.ctor() + IL_0006: nop + IL_0007: ret + } +} + +.class interface public auto ansi abstract IReabstractDefaultImplementation + implements IInheritedDefaultImplInterface, IInterface +{ + .method private final hidebysig abstract virtual + instance void IInterface.Method () cil managed + { + .override method instance void IInterface::Method() + } +} + +.class public auto ansi beforefieldinit ChildClassInheritsFromInterfaceWithDefaultImplementationWhereChildInterfaceReabstractsInterfaceMethod_InvalidType_InterfaceMethodNotImplemented + extends [System.Runtime]System.Object + implements IReabstractDefaultImplementation, IInheritedDefaultImplInterface, IInterface +{ + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [System.Runtime]System.Object::.ctor() + IL_0006: nop + IL_0007: ret + } +} diff --git a/src/tests/ilverify/ILTests/DefaultInterfaceMethod.ilproj b/src/tests/ilverify/ILTests/DefaultInterfaceMethod.ilproj new file mode 100644 index 00000000000000..8e8765d14a524d --- /dev/null +++ b/src/tests/ilverify/ILTests/DefaultInterfaceMethod.ilproj @@ -0,0 +1,3 @@ + + + diff --git a/src/tests/ilverify/ILTests/InterfaceImplementation.il b/src/tests/ilverify/ILTests/InterfaceImplementation.il index 29f5c49b50399e..5264e54bbbe2eb 100644 --- a/src/tests/ilverify/ILTests/InterfaceImplementation.il +++ b/src/tests/ilverify/ILTests/InterfaceImplementation.il @@ -448,54 +448,3 @@ { } } - -.class public auto ansi beforefieldinit ChildClassDoesNotImplementDefaultInterfaceMethod_ValidType_Valid - extends [System.Runtime]System.Object - implements IDefaultImplInterface -{ - .method public hidebysig specialname rtspecialname - instance void .ctor () cil managed - { - .maxstack 8 - - IL_0000: ldarg.0 - IL_0001: call instance void [System.Runtime]System.Object::.ctor() - IL_0006: nop - IL_0007: ret - } -} - -.class public auto ansi beforefieldinit ChildClassDoesImplementDefaultInterfaceMethod_ValidType_Valid - extends [System.Runtime]System.Object - implements IDefaultImplInterface -{ - .method public final hidebysig newslot virtual - instance void DefaultImplementation () cil managed - { - .maxstack 8 - - IL_0000: ret - } - - .method public hidebysig specialname rtspecialname - instance void .ctor () cil managed - { - .maxstack 8 - - IL_0000: ldarg.0 - IL_0001: call instance void [System.Runtime]System.Object::.ctor() - IL_0006: nop - IL_0007: ret - } -} - -.class interface public auto ansi abstract IDefaultImplInterface -{ - .method public hidebysig newslot virtual - instance void DefaultImplementation () cil managed - { - .maxstack 8 - - IL_0000: ret - } -} \ No newline at end of file