Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/coreclr/tools/ILVerification/TypeVerifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
125 changes: 125 additions & 0 deletions src/tests/ilverify/ILTests/DefaultInterfaceMethod.il
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

.assembly DefaultImpl
{
}

.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
}
}
3 changes: 3 additions & 0 deletions src/tests/ilverify/ILTests/DefaultInterfaceMethod.ilproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="ILTests.targets" />
</Project>
51 changes: 0 additions & 51 deletions src/tests/ilverify/ILTests/InterfaceImplementation.il
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}