diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/CompilerGeneratedState.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/CompilerGeneratedState.cs index 359ccf70cfe78..cbfb822cc3c49 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/CompilerGeneratedState.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/CompilerGeneratedState.cs @@ -288,24 +288,11 @@ referencedMethod.OwningType is MetadataType generatedType && { Debug.Assert(generatedType == generatedType.GetTypeDefinition()); - if (HasGenericParameters(generatedType)) + if (generatedType.HasInstantiation) MapGeneratedTypeTypeParameters(generatedType); } } - /// - /// Check if the type itself is generic. The only difference is that - /// if the type is a nested type, the generic parameters from its - /// parent type don't count. - /// - static bool HasGenericParameters(MetadataType typeDef) - { - if (typeDef.ContainingType == null) - return typeDef.HasInstantiation; - - return typeDef.Instantiation.Length > typeDef.ContainingType.Instantiation.Length; - } - void MapGeneratedTypeTypeParameters(MetadataType generatedType) { Debug.Assert(CompilerGeneratedNames.IsGeneratedType(generatedType.Name)); diff --git a/src/tools/illink/src/linker/Linker.Dataflow/CompilerGeneratedState.cs b/src/tools/illink/src/linker/Linker.Dataflow/CompilerGeneratedState.cs index cc7d205b9fb9d..04617793f7f3a 100644 --- a/src/tools/illink/src/linker/Linker.Dataflow/CompilerGeneratedState.cs +++ b/src/tools/illink/src/linker/Linker.Dataflow/CompilerGeneratedState.cs @@ -283,7 +283,7 @@ referencedMethod.DeclaringType is var generatedType && // Now that we have instantiating methods fully filled out, walk the generated types and fill in the attribute // providers foreach (var generatedType in generatedTypeToTypeArgs.Keys) { - if (HasGenericParameters (generatedType)) { + if (generatedType.HasGenericParameters) { MapGeneratedTypeTypeParameters (generatedType, generatedTypeToTypeArgs, _context); // Finally, add resolved type arguments to the cache var info = generatedTypeToTypeArgs[generatedType]; @@ -298,19 +298,6 @@ referencedMethod.DeclaringType is var generatedType && _cachedTypeToCompilerGeneratedMembers.Add (type, compilerGeneratedCallees); return type; - /// - /// Check if the type itself is generic. The only difference is that - /// if the type is a nested type, the generic parameters from its - /// parent type don't count. - /// - static bool HasGenericParameters (TypeDefinition typeDef) - { - if (!typeDef.IsNested) - return typeDef.HasGenericParameters; - - return typeDef.GenericParameters.Count > typeDef.DeclaringType.GenericParameters.Count; - } - /// /// Attempts to reverse the process of the compiler's alpha renaming. So if the original code was /// something like this: diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedTypes.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedTypes.cs index f99a80b202292..c414bc252d128 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedTypes.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedTypes.cs @@ -32,6 +32,7 @@ public static void Main () AsyncCapture (); AsyncTypeMismatch (); AsyncInsideClosure (); + AsyncInsideClosureNonGeneric (); AsyncInsideClosureMismatch (); // Closures @@ -220,6 +221,22 @@ private static void AsyncInsideClosure () } } + private static void AsyncInsideClosureNonGeneric () + { + Outer (); + void Outer<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] T1> () + { + int x = 0; + Inner ().Wait (); + async Task Inner () + { + await Task.Delay (0); + x++; + _ = typeof (T1).GetMethods (); + } + } + } + private static void AsyncInsideClosureMismatch () { Outer ();