}
}
+BOOL TypeDesc::IsSharedByGenericInstantiations()
+{
+ LIMITED_METHOD_DAC_CONTRACT;
+
+ if (HasTypeParam())
+ {
+ return GetRootTypeParam().IsCanonicalSubtype();
+ }
+
+ if (IsFnPtr())
+ {
+ return dac_cast<PTR_FnPtrTypeDesc>(this)->IsSharedByGenericInstantiations();
+ }
+
+ return FALSE;
+}
+
PTR_BaseDomain TypeDesc::GetDomain()
{
CONTRACTL
TypeHandle *
FnPtrTypeDesc::GetRetAndArgTypes()
{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
+ LIMITED_METHOD_CONTRACT;
return m_RetAndArgTypes;
} // FnPtrTypeDesc::GetRetAndArgTypes
+BOOL
+FnPtrTypeDesc::IsSharedByGenericInstantiations()
+{
+ LIMITED_METHOD_DAC_CONTRACT;
+
+ for (DWORD i = 0; i <= m_NumArgs; i++)
+ {
+ if (m_RetAndArgTypes[i].IsCanonicalSubtype())
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+} // FnPtrTypeDesc::IsSharedByGenericInstantiations
+
#ifndef DACCESS_COMPILE
// Returns TRUE if all return and argument types are externally visible.
}
CONTRACTL_END;
- const TypeHandle * rgRetAndArgTypes = GetRetAndArgTypes();
for (DWORD i = 0; i <= m_NumArgs; i++)
{
- if (!rgRetAndArgTypes[i].IsExternallyVisible())
+ if (!m_RetAndArgTypes[i].IsExternallyVisible())
{
return FALSE;
}
return GetLoaderModule()->GetLoaderAllocator();
}
+ BOOL IsSharedByGenericInstantiations();
+
protected:
// See methodtable.h for details of the flags with the same name there
enum
return PTR_TypeHandle(m_RetAndArgTypes);
}
+ BOOL IsSharedByGenericInstantiations();
+
#ifndef DACCESS_COMPILE
// Returns TRUE if all return and argument types are externally visible.
BOOL IsExternallyVisible() const;
{
LIMITED_METHOD_DAC_CONTRACT;
- if (IsArray())
+ if (IsTypeDesc())
{
- return GetArrayElementTypeHandle().IsCanonicalSubtype();
+ return AsTypeDesc()->IsSharedByGenericInstantiations();
}
- else if (!IsTypeDesc())
+ else
{
+ if (IsArray())
+ return GetArrayElementTypeHandle().IsCanonicalSubtype();
+
return AsMethodTable()->IsSharedByGenericInstantiations();
}
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+
+#pragma warning disable 8500
+
+public unsafe class Program
+{
+ static void AssertEqual<T>(T actual, T expected)
+ {
+ if (!actual.Equals(expected))
+ throw new Exception($"Failed Scenario. Actual = {actual}. Expected = {expected}");
+ }
+
+ public static Type GrabArray<T>() => typeof(T[]);
+ public static Type GrabPtr<T>() => typeof(T*);
+ public static Type GrabFnptr<T>() => typeof(delegate*<T>);
+
+ public static int Main()
+ {
+ AssertEqual(GrabArray<int>().GetElementType(), typeof(int));
+ AssertEqual(GrabArray<string>().GetElementType(), typeof(string));
+
+ AssertEqual(GrabPtr<uint>().GetElementType(), typeof(uint));
+ AssertEqual(GrabPtr<object>().GetElementType(), typeof(object));
+
+ AssertEqual(GrabFnptr<DateTime>().GetFunctionPointerReturnType(), typeof(DateTime));
+ AssertEqual(GrabFnptr<Action>().GetFunctionPointerReturnType(), typeof(Action));
+
+ return 100;
+ }
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="test85240.cs" />
+ </ItemGroup>
+</Project>
<!-- Known failures for mono runtime on *all* architectures/operating systems in *all* runtime modes -->
<ItemGroup Condition="'$(RuntimeFlavor)' == 'mono'" >
+ <ExcludeList Include="$(XunitTestBinBase)/Regressions/coreclr/GitHub_85240/test85240/**">
+ <Issue>https://github.com/dotnet/runtime/issues/71095</Issue>
+ </ExcludeList>
<ExcludeList Include="$(XunitTestBinBase)/JIT/opt/Remainder/Regressions/Regression1/**">
<Issue>https://github.com/dotnet/runtime/issues/79022</Issue>
</ExcludeList>