未验证 提交 ef7c9471 编写于 作者: J Jared Parsons 提交者: GitHub

Merge pull request #38135 from RikkiGibson/nested-generic-pointer

Give LangVersion error when type is generic due to parent type
......@@ -220,8 +220,9 @@ private static (bool definitelyManaged, bool hasGenerics) DependsOnDefinitelyMan
}
/// <summary>
/// Returns a boolean value if we can determine whether the type is managed
/// without looking at its fields and Unset otherwise.
/// Returns True or False if we can determine whether the type is managed
/// without looking at its fields and Unknown otherwise.
/// Also returns whether or not the given type is generic.
/// </summary>
private static (ThreeState isManaged, bool hasGenerics) IsManagedTypeHelper(NamedTypeSymbol type)
{
......@@ -231,7 +232,7 @@ private static (ThreeState isManaged, bool hasGenerics) IsManagedTypeHelper(Name
type = type.GetEnumUnderlyingType();
}
bool hasGenerics = type.TupleUnderlyingTypeOrSelf().GetArity() > 0;
bool hasGenerics = type.TupleUnderlyingTypeOrSelf() is NamedTypeSymbol { IsGenericType: true };
// Short-circuit common cases.
switch (type.SpecialType)
......
......@@ -3938,6 +3938,33 @@ public unsafe struct OtherStruct
CreateCompilation(code, options: TestOptions.UnsafeReleaseDll).VerifyDiagnostics();
}
[Fact]
public void GenericNestedStructPointerFieldRequiresCSharp8()
{
var code = @"
public struct MyStruct<T>
{
public struct InnerStruct
{
public T field;
}
}
public unsafe struct OtherStruct
{
public MyStruct<int>.InnerStruct* ms;
}
";
CreateCompilation(code, options: TestOptions.UnsafeReleaseDll, parseOptions: TestOptions.Regular7_3)
.VerifyDiagnostics(
// (12,39): error CS8370: Feature 'unmanaged constructed types' is not available in C# 7.3. Please use language version 8.0 or greater.
// public MyStruct<int>.InnerStruct* ms;
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion7_3, "ms").WithArguments("unmanaged constructed types", "8.0").WithLocation(12, 39)
);
CreateCompilation(code, options: TestOptions.UnsafeReleaseDll).VerifyDiagnostics();
}
[Fact, WorkItem(32103, "https://github.com/dotnet/roslyn/issues/32103")]
public void StructContainingTuple_Unmanaged_RequiresCSharp8()
{
......
......@@ -2715,11 +2715,14 @@ class C<U>
S<int> f2;
S<U>.R f3;
S<int>.R f4;
S<U>.R2 f5;
S<int>.R2 f6;
}
struct S<T>
{
struct R { }
internal struct R2 { }
}
";
var compilation = CreateCompilation(text);
......@@ -2734,6 +2737,11 @@ struct R { }
Assert.Equal(ManagedKind.Managed, type.GetMember<FieldSymbol>("f3").Type.ManagedKind);
Assert.True(type.GetMember<FieldSymbol>("f4").Type.IsManagedType);
Assert.Equal(ManagedKind.Managed, type.GetMember<FieldSymbol>("f4").Type.ManagedKind);
Assert.False(type.GetMember<FieldSymbol>("f5").Type.IsManagedType);
Assert.Equal(ManagedKind.UnmanagedWithGenerics, type.GetMember<FieldSymbol>("f5").Type.ManagedKind);
Assert.False(type.GetMember<FieldSymbol>("f6").Type.IsManagedType);
Assert.Equal(ManagedKind.UnmanagedWithGenerics, type.GetMember<FieldSymbol>("f6").Type.ManagedKind);
}
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册