Move the MethodImpl iterator when checking default interface methods (#16099)
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>
Tue, 30 Jan 2018 20:08:58 +0000 (21:08 +0100)
committerJan Kotas <jkotas@microsoft.com>
Tue, 30 Jan 2018 20:08:58 +0000 (12:08 -0800)
Fixes #16064.

src/vm/methodtablebuilder.cpp
tests/src/Regressions/coreclr/16064/methodimpl.il [new file with mode: 0644]
tests/src/Regressions/coreclr/16064/methodimpl.ilproj [new file with mode: 0644]

index 9308844..1d58704 100644 (file)
@@ -10821,7 +10821,7 @@ BOOL MethodTableBuilder::HasDefaultInterfaceImplementation(MethodDesc *pDeclMD)
                 if (pMD->IsMethodImpl())
                 {
                     MethodImpl::Iterator it(pMD);
-                    while (it.IsValid())
+                    for (; it.IsValid(); it.Next())
                     {
                         if (it.GetMethodDesc() == pDeclMD)
                             return TRUE;
diff --git a/tests/src/Regressions/coreclr/16064/methodimpl.il b/tests/src/Regressions/coreclr/16064/methodimpl.il
new file mode 100644 (file)
index 0000000..289f8ad
--- /dev/null
@@ -0,0 +1,63 @@
+// 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.
+
+.assembly extern System.Runtime { }
+
+.assembly methodimpl { }
+
+.class interface private abstract auto ansi IFoo
+{
+  .method public hidebysig newslot virtual abstract instance int32 Frob() cil managed
+  {
+  }
+
+  .method public hidebysig newslot virtual abstract instance int32 Unrelated() cil managed
+  {
+  }
+}
+
+.class interface private abstract auto ansi IBar
+       implements IFoo
+{
+  .method public hidebysig newslot virtual final instance int32 Frob() cil managed
+  {
+    .override IFoo::Frob
+    .override IFoo::Unrelated
+    ldc.i4 50
+    ret
+  }
+}
+
+.class private auto ansi beforefieldinit Fooer
+       extends [System.Runtime]System.Object
+       implements IBar
+{
+  .method public hidebysig specialname rtspecialname 
+          instance void .ctor() cil managed
+  {
+    ldarg.0
+    call instance void [System.Runtime]System.Object::.ctor()
+    ret
+  }
+}
+
+.method public hidebysig static int32 Main() cil managed
+{
+  .entrypoint
+  ldstr "DefaultImplementationsOfInterfaces"
+  call bool [System.Runtime]System.Runtime.CompilerServices.RuntimeFeature::IsSupported(string)
+
+  // If default interfaces are not supported, consider the test successful.
+  brtrue DoRunTest
+  ldc.i4 100
+  ret
+
+DoRunTest:
+  newobj instance void Fooer::.ctor()
+  callvirt instance int32 IFoo::Frob()
+  newobj instance void Fooer::.ctor()
+  callvirt instance int32 IFoo::Unrelated()
+  add
+  ret
+}
diff --git a/tests/src/Regressions/coreclr/16064/methodimpl.ilproj b/tests/src/Regressions/coreclr/16064/methodimpl.ilproj
new file mode 100644 (file)
index 0000000..32da058
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{85DFC527-4DB1-595E-A7D7-E94EE1F8140D}</ProjectGuid>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
+    <OutputType>Exe</OutputType>
+    <CLRTestKind>BuildAndRun</CLRTestKind>
+    <CLRTestPriority>0</CLRTestPriority>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="methodimpl.il" />
+  </ItemGroup>
+
+
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>