dotnet/roslyn

Improve CS8893 when CallConvX is not defined in corelib

Open

#49,638 opened on Nov 26, 2020

View on GitHub
 (4 comments) (0 reactions) (0 assignees)C# (4,257 forks)batch import
Area-CompilersConcept-Diagnostic Clarityhelp wanted

Repository metrics

Stars
 (20,414 stars)
PR merge metrics
 (Avg merge 6d 17h) (256 merged PRs in 30d)

Description

Version Used: .NET CORE SDK 5.0.100

Steps to Reproduce:

  1. Create a new library that targets netcoreapp3.1.
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
</Project>
  1. Attempt to compile the following code:
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace MyNamespace
{
	public class Class1
	{
		[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
		public static void TestImpl() { }
	}
}

#if !NET5_0
namespace System.Runtime.InteropServices
{
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	public sealed class UnmanagedCallersOnlyAttribute : Attribute
	{
		public UnmanagedCallersOnlyAttribute() { }
		public Type[] CallConvs;
		public string EntryPoint;
	}
}
#endif

Expected Behavior:

Build succeeded. 0 Warning(s) 0 Error(s)

Actual Behavior:

error CS8893: 'CallConvStdcall' is not a valid calling convention type for 'UnmanagedCallersOnly'.

Notes: This code compiles fine for net45, netstandard2.0, netstandard2.1.

Contributor guide